home *** CD-ROM | disk | FTP | other *** search
/ Amiga Plus 1995 #1 / Amiga Plus 1995 #1.iso / fish-disketten / fish_941-950 / d949 / bbbbs / bbbbs65.lha / rexx / bbsLOCAL.rexx < prev    next >
OS/2 REXX Batch file  |  1993-10-31  |  166KB  |  6,039 lines

  1. /* $VER: bbsLOCAL.rexx 6.5 © 1993 Richard Lee Stockton 7:56PM (31.10.93)
  2.         - FREELY DISTRIBUTABLE AS LONG AS THIS NOTICE REMAINS -
  3.  
  4.                 BBBBS.baud without the BaudBandit stuff
  5.        Will multi-task with BBBBS.baud (within limits, see docs)
  6.      THIS IS THE SYSOP'S VERSION OF BBBBS.baud FOR LOCAL USE ONLY!
  7. */
  8.  
  9. copyright.=''
  10. copyright.1=STRIP(SUBSTR(SOURCELINE(1),10))
  11. copyright.2='
  12. from Gramma Software 21305-60th Ave West, Mountlake Terrace WA 98043-2009'
  13. copyright.3='
  14. ARexx portions of this software copyright 1990-93 Richard Lee Stockton'
  15. copyright.4='- FREELY DISTRIBUTABLE as long as this notice remains -'
  16.  
  17. /* If the QuickSortPort not found then try to run setup.rexx */
  18.  
  19. IF ~show('P','QuickSortPort') THEN CALL setup.rexx()
  20. IF ~show('P','QuickSortPort') THEN EXIT
  21.  
  22. IF SHOW('P','BBBBS_LOCAL') THEN
  23.   DO
  24.     SAY 'bbsLOCAL.rexx is already running!'
  25.     EXIT 0
  26.   END
  27. IF SHOW('P','BBBBS') & GETCLIP('BBS_maint')~='' THEN
  28.   DO
  29.     SAY 'BBS_maint flag is set. Wait until processing is finished, then restart.'
  30.     EXIT 0
  31.   END
  32. CALL SETCLIP('BBS_mainfiles')
  33. CALL SETCLIP('BBS_mainusers')
  34. CALL OPENPORT('BBBBS_LOCAL')
  35.  
  36. PARSE VERSION . . cpu .
  37. cpu=RIGHT(cpu,2)/10
  38. IF cpu<1 THEN cpu=1
  39.  
  40. /* BBS Directories (may be created with SETUP option) */
  41. bbs.=''
  42. bbs.1='Information' /* text files from sysop for the user to read */
  43. bbs.6='Scratch'
  44. bbs.7='BBS_HELP'
  45. bbs.8='rexxDoors'
  46. bbs.9='BBS_TEXT'    /* text files for BBS use. WELCOME HELLO, NEW etc. */
  47. bbs.10='FileNotes'
  48. bbs.11='BBS_LIBS'
  49. bbs.12='BBS_MSGS'
  50. bbs.13='Lists'
  51. bbs.14='Numbers'    /* 1st & last messages, mail, files */
  52. bbs.15='Usage'
  53. bbs.16='Logs'
  54. bbs.17='EMailFiles'
  55. bbs.18='EMail'
  56. bbs.19='Users'
  57.  
  58.  
  59. /* VARIABLES */
  60.  
  61. bbsprefs.=0 /* start with all prefs OFF */
  62. alpha.=''
  63. lastread.=0
  64. dirnum=1
  65. linesperpage=20
  66. sortuserflag=0
  67. sortalphaflag=0
  68. savefileflag=0
  69. emailonline=-1
  70. level=0
  71. lastread.=0
  72. totwrit.=0
  73. lastbrowse=0
  74. warnings=0
  75. winnings=0
  76. nonstop=0
  77. newfilesdate=''
  78. newpassword=''
  79. replysubj=''
  80. msgdir=1
  81. menuflag=1
  82. logonflag=1
  83. data.=''
  84.  
  85.  
  86. /* TEXT - User data structure by line */
  87.  
  88. text.=''
  89. text.1='   Full Name'
  90. text.2='      Street'
  91. text.3='City, ST Zip'
  92. text.4=' Voice Phone'
  93. text.5='    Password'
  94. text.6='    Protocol'
  95. text.7='LinesPerPage'
  96. text.8=' Preferences'
  97. text.9='    Computer'
  98. text.10='   Interests'
  99. text.11='Session Time'
  100. text.12='FirstSession'
  101. text.13='Last Session'
  102. text.14='      UpLoad'
  103. text.15='    Download'
  104. text.16='   Last File'
  105. text.17='Ratio  Email'
  106. text.18='    Winnings'
  107. text.19='       Usage'
  108. text.20='       Level'
  109. text.21='Exclude DIRS'
  110. text.22='   Msgs Read'
  111. text.23='   Msgs Writ'
  112. text.24=' Marked Msgs'
  113. text.25='Marked Files'
  114. text.26='QUICKexclude'
  115. text.27=' CBV numbers'
  116.  
  117.  
  118. /* try to trap everything */
  119.  
  120. SIGNAL ON BREAK_C
  121. OPTIONS RESULTS
  122. OPTIONS FAILAT 999999
  123. SIGNAL ON BREAK_E
  124. SIGNAL ON SYNTAX
  125. SIGNAL ON FAILURE
  126. NUMERIC DIGITS 14
  127.  
  128.  
  129. ARG option .
  130.  
  131. SAY CENTER(copyright.1,75)
  132. CALL config()
  133.  
  134. IF ~EXISTS(bbspath'Numbers/FirstLogon') THEN
  135.   ADDRESS COMMAND 'C:Date >'bbspath'Numbers/FirstLogon'
  136.  
  137. SAY CENTER(copyright.2,75)
  138. SAY CENTER(copyright.3,75)
  139. SAY CENTER(copyright.4,75)
  140. SAY
  141.  
  142.  
  143. IF option='SETUP' THEN
  144.   DO
  145.     SAY 'Making sure all needed directories are here...'
  146.     DO i=1 TO 20
  147.       IF bbs.i~='' THEN CALL MAKEDIR(bbspath||bbs.i)
  148.     END
  149.   END
  150.  
  151. CALL colors(1)
  152.  
  153. msg.=''
  154. IF readopen(bbspath'Lists/Conferences') THEN
  155.   DO
  156.     DO i=1
  157.       line=READLN(f)
  158.       IF line='END' THEN BREAK
  159.       IF EOF(f) THEN BREAK
  160.       num=WORD(line,1)
  161.       IF DATATYPE(num,'W') THEN msg.num=WORD(line,2)
  162.     END
  163.     CALL CLOSE(f)
  164.   END
  165. IF option='SETUP' THEN
  166.   DO
  167.     DO i=1 TO 99
  168.       IF msg.i~='' THEN CALL MAKEDIR(msgpath||i)
  169.     END
  170.   END
  171.  
  172. courtesy=''
  173. IF EXISTS(bbspath'Lists/Courtesy') THEN
  174.   DO
  175.     IF readopen(bbspath'Lists/Courtesy') THEN
  176.       DO
  177.         DO i=1
  178.           line=READLN(f)
  179.           IF EOF(f) THEN BREAK
  180.           courtesy=courtesy line
  181.         END
  182.         CALL CLOSE(f)
  183.       END
  184.   END
  185.  
  186. dirs.=''
  187. IF readopen(bbspath'Lists/Libraries') THEN
  188.   DO
  189.     DO i=1
  190.       line=READLN(f)
  191.       IF line='END' | EOF(f) THEN LEAVE i
  192.       num=WORD(line,1)
  193.       IF DATATYPE(num,'W') THEN dirs.num=STRIP(WORD(line,2))
  194.     END
  195.     CALL CLOSE(f)
  196.   END
  197. IF option='SETUP' THEN
  198.   DO
  199.     SAY 'Making sure all file library directories are here...'
  200.     DO i=1 TO 99
  201.       IF dirs.i~='' THEN
  202.         DO
  203.           CALL MAKEDIR(libpath||dirs.i)
  204.           CALL MAKEDIR(bbspath'FileNotes/'dirs.i)
  205.         END
  206.     END
  207.   END
  208.  
  209. CALL loaduserlist()
  210. SAY '          The larger the BBS gets, the longer the setup takes...'
  211.  
  212. files.=''
  213. IF readopen(bbspath'Lists/Files') THEN
  214.   DO
  215.     DO i=1
  216.       line=READLN(f)
  217.       IF EOF(f) THEN BREAK
  218.       num=WORD(line,1)
  219.       IF DATATYPE(num,'W') THEN files.num=WORD(line,2) WORD(line,3)
  220.     END
  221.     files.0=i-1
  222.     CALL CLOSE(f)
  223.   END
  224.  
  225. IF readopen(bbspath'Lists/Files.ALPHA') THEN
  226.   DO
  227.     DO i=1
  228.       line=READLN(f)
  229.       IF EOF(f) THEN BREAK
  230.       alpha.i=line
  231.       fnum=WORD(line,3)
  232.       files.fnum.0=i
  233.     END
  234.     alpha.0=i-1
  235.     CALL CLOSE(f)
  236.   END
  237.  
  238. CALL set_grand()
  239.  
  240. BIG_LOOP:
  241. /** Identify (title) message */
  242. IF EXISTS(bbspath'BBS_TEXT/HELLO') THEN
  243.   DO
  244.     SAY 
  245.     arg=bbspath'BBS_TEXT/HELLO'
  246.     CALL readlines(arg 1)
  247.     CALL seelines(0)
  248.   END
  249. SAY
  250. SAY pen3'Courtesy List:'def
  251. SAY courtesy
  252. SAY
  253.  
  254.  
  255. /* Ask for name */
  256. name=''
  257. DO count=1 TO 3
  258.   name=getinput(1 0 'Please enter name: ')
  259.   name=SPACE(name,1,'_')
  260.   IF name='NEW' THEN LEAVE count
  261.   IF name~='' THEN
  262.     DO
  263.       IF FIND(userlist,name)>0 THEN LEAVE count
  264.       IF FIND(exclusion,name)>0 THEN
  265.         DO
  266.           SAY 'Sorry, that is a reserved name.'
  267.           name=''
  268.           ITERATE count
  269.         END
  270.       IF bbsprefs.7>0 | FIND(courtesy,name)>0 THEN
  271.         DO
  272.           SAY
  273.           SAY 'Welcome' name'!'
  274.           SAY 'You will be automatically validated after you enter your user info.'
  275.           SAY
  276.           LEAVE count
  277.         END
  278.     END
  279.   IF count<3 THEN SAY 'New Users please enter NEW to apply for validation.'
  280. END
  281. IF count>3 THEN SIGNAL DONE
  282. CALL checkUser()
  283. IF UPPER(WORD(data.12,3))~='BIRTHDAY:' THEN
  284.   DO
  285.     SAY
  286.     SAY 'Please help us out by entering the following information.'
  287.     CALL getbirth()
  288.     SAY '   Thank you!'
  289.   END
  290. CALL checkclips()
  291. city=docity(data.3)
  292.  
  293. CALL TIME('R')
  294.  
  295. IF RIGHT(WORD(data.12,4),4)=RIGHT(DATE('S'),4) THEN
  296.   DO
  297.     arg=bbspath'BBS_TEXT/BIRTHDAY'
  298.     IF EXISTS(arg) THEN 
  299.       DO
  300.         SAY
  301.         CALL showtext(arg)
  302.       END
  303.     SAY
  304.     SAY '***  Happy Birthday,' pen3||data.1||def', and many more!  ***'
  305.     SAY
  306.   END
  307. SAY 
  308.  
  309. CALL bbsLOGON.baud(name level)
  310. CALL sortlibraries()
  311. IF FIND(data.8,'QUICK')>0 THEN CALL do_quick(0)
  312.  
  313.  
  314. /* Opening Display after logon. Seen by all Users ONCE A DAY. It first  */
  315. /* looks for a unique yearly data (ie, WELCOME.0704), then daily data   */
  316. /* (ie, WELCOME.Fri), and finally a simple, everyday 'WELCOME' datafile */
  317.  
  318. IF DATE('I')>lastondate THEN
  319.   DO
  320.     SAY
  321.     arg=bbspath'BBS_TEXT/WELCOME.'RIGHT(DATE('S'),4)
  322.     IF EXISTS(arg) THEN CALL showtext(arg)
  323.     SAY
  324.     arg=bbspath'BBS_TEXT/WELCOME.'LEFT(DATE('W'),3)
  325.     IF EXISTS(arg) THEN CALL showtext(arg)
  326.     SAY
  327.     arg=bbspath'BBS_TEXT/WELCOME'
  328.     IF EXISTS(arg) THEN CALL showtext(arg)
  329.  
  330. /*
  331. Looks for format UNTIL.YYYYMMDD ie, "UNTIL.19920514"
  332. Deletes any that are previous to "today"
  333. */
  334.  
  335.     untils.=''
  336.     IF FileList(bbspath'BBS_TEXT/UNTIL.*',untils)>0 THEN
  337.       DO
  338.         CALL QSORT(1,untils.0,untils)
  339.         DO ui=1 TO untils.0
  340.           IF RIGHT(untils.ui,8)<DATE('S') THEN CALL DELETE(untils.ui)
  341.           ELSE
  342.             DO
  343.               SAY
  344.               CALL showtext(untils.ui)
  345.             END
  346.         END
  347.       END
  348.     DROP untils.
  349.   END
  350.  
  351. IF bbsprefs.1 & ~terseflag THEN
  352.   DO
  353.     IF doGrin()>3 THEN CALL waiting()
  354.     IF EXISTS(bbspath'rexxDoors/Moon.rexx') THEN CALL Moon.rexx()
  355.     IF EXISTS(bbspath'rexxDoors/Time.rexx') THEN CALL Time.rexx()
  356.     IF FIND(UPPER(SHOWLIST('A')),'TODAY')>0 THEN
  357.       DO
  358.         IF EXISTS('RAM:TODAY') THEN
  359.           DO
  360.             finfo=STATEF('RAM:TODAY')
  361.             IF WORD(finfo,5)~=DATE('I') THEN
  362.               ADDRESS COMMAND 'C:Today091 >RAM:TODAY'
  363.           END
  364.         ELSE ADDRESS COMMAND 'C:Today091 >RAM:TODAY'
  365.         IF EXISTS('RAM:TODAY') THEN
  366.           DO
  367.             CALL readlines('RAM:TODAY' 1)
  368.             CALL seelines(0)
  369.           END
  370.       END
  371.     SAY
  372.   END
  373.  
  374. CALL readmail(0)
  375. IF ~terseflag THEN
  376.   DO
  377.     IF level>sysoplevel THEN
  378.       DO
  379.         lstmail=WORD(data.17,3)
  380.         IF ~DATATYPE(lstmail,'W') THEN lstmail=0
  381.         IF countcheck(bbspath'Numbers/LastMail' 0)>lstmail THEN
  382.           IF getinput(1 1 'Check Email? (Ny) > ')='Y' THEN CALL mailreport()
  383.         IF level<99 THEN
  384.           DO
  385.             SAY
  386.             CALL showtext(bbspath'Email/'sysop'/NEW_FILES')
  387.           END
  388.         SAY
  389.         CALL showtext(bbspath'Lists/NEW_USERS')
  390.         CALL showtext(bbspath'Lists/CBV_USERS')
  391.       END
  392.     CALL logonstats()
  393.     CALL newinfo()
  394.   END
  395. CALL showmarked(1)
  396. CALL setdir(libpath||dirs.1)
  397. logonflag=0
  398.  
  399.  
  400. /***** MAIN *****/
  401.  
  402. IF menu~='ALL' THEN menu='MAIN'
  403.  
  404. RESTART:
  405. SIGNAL ON BREAK_C
  406. SIGNAL ON BREAK_E
  407.  
  408. waitchar=''
  409. string=''
  410. opt=''
  411. IF level<1 THEN menu='NEW'
  412. DO WHILE(opt~='G')
  413.   go=0
  414.   DO WHILE(~go)
  415.     IF waitchar='' | waitchar='?' THEN
  416.       DO
  417.         commands='cghiqsvwxyz!#,'
  418.         IF level>0  THEN commands='abcdefghijlmnoprstuvwxyz!$#&.,+'
  419.         IF level>sysoplevel THEN commands=commands'k%^()=;'
  420.         IF level=99 THEN commands=commands'@~'
  421.         commands=commands'?'
  422.         IF menuflag | waitchar='?' | string='?' THEN
  423.           DO
  424.             opt='MENU'
  425.             arg=''
  426.             CALL menus()
  427.           END
  428.         ELSE SAY pen3'COMMANDS:'def commands
  429.       END
  430.     line=''
  431.     line=line||bak2' 'TIME('C')' 'def
  432.     IF menu='ALL' | menu='FILE' THEN
  433.       line=line pen3'FILE_LIBRARY:'plaindir||def
  434.     ELSE IF menu='MSG' THEN line=line pen3'MESSAGES:'def
  435.     ELSE line=line pen3'MAIN:'def
  436.     line=line'  'bbsname
  437.     IF waitchar='' THEN waitchar=getinput(0 0 line' > ')
  438.     PARSE VAR waitchar string' 'arg
  439.     nonstop=0
  440.     string=UPPER(STRIP(string))
  441.     IF string='OFF' | string='BYE' THEN SIGNAL LOGOUT
  442.     IF string='FL' & level>0 THEN CALL Friends()
  443.     CALL checkalias()
  444.     waitchar=''
  445.     IF DATATYPE(string,'W') THEN
  446.       DO
  447.         IF string>level THEN
  448.           DO
  449.             arg=STRIP(string arg)
  450.             string='D'
  451.           END
  452.         ELSE
  453.           DO
  454.             dirnum=string
  455.             CALL chdir2()
  456.             CALL since()
  457.           END
  458.       END
  459.     IF string='QUICK' & level>0 THEN CALL do_quick(1)
  460.     opt=left(string,1)
  461.     go=1
  462.     IF POS(opt,UPPER(commands))=0 THEN go=0
  463.   END
  464.   OPTIONS PROMPT 'Filename: '
  465.   SELECT
  466.     WHEN opt='A' THEN CALL showalpha()
  467.     WHEN opt='B' THEN CALL browse()
  468.     WHEN opt='C' THEN CALL editor('MAIL' sysop)
  469.     WHEN opt='D' THEN CALL dload()
  470.     WHEN opt='E' THEN CALL readmail(1)
  471.     WHEN opt='F' THEN CALL do_F()
  472.     WHEN opt='H' THEN CALL help('MAIN')
  473.     WHEN opt='I' THEN CALL information()
  474.     WHEN opt='J' THEN CALL jump2rexx()
  475.     WHEN opt='K' THEN CALL killuser()
  476.     WHEN opt='L' THEN CALL list()
  477.     WHEN opt='M' THEN IF menu~='ALL' THEN menu='MSG'
  478.     WHEN opt='N' THEN CALL newfiles()
  479.     WHEN opt='O' THEN CALL otheruser()
  480.     WHEN opt='P' THEN CALL editor('MSG')
  481.     WHEN opt='R' THEN CALL readmessages()
  482.     WHEN opt='S' THEN CALL bbsSEARCH()
  483.     WHEN opt='U' THEN CALL uload(1)
  484.     WHEN opt='V' THEN CALL showtext(bbspath'Usage/USER.LOG')
  485.     WHEN opt='W' THEN CALL showuserlist()
  486.     WHEN opt='X' THEN CALL switchmenuflag()
  487.     WHEN opt='Y' THEN CALL edituser()
  488.     WHEN opt='Z' THEN CALL counts()
  489.     WHEN opt='~' THEN CALL sysED(1)
  490.     WHEN opt='@' THEN CALL shell()
  491.     WHEN opt='#' THEN CALL switchcolors()
  492.     WHEN opt='$' THEN IF menu='ALL' THEN menu='MAIN'; ELSE menu='ALL'
  493.     WHEN opt='%' THEN CALL editnote()
  494.     WHEN opt='^' THEN CALL readlogs()
  495.     WHEN opt='&' THEN CALL profiles()
  496.     WHEN opt=';' THEN CALL changename()
  497.     WHEN opt='(' THEN CALL filereport()
  498.     WHEN opt=')' THEN CALL mailreport()
  499.     WHEN opt='=' THEN CALL levelreport()
  500.     WHEN opt='+' THEN CALL ext_dload()
  501.     WHEN opt='.' THEN menu='MAIN'
  502.     WHEN opt=',' THEN DO;CALL hourly();CALL waiting();END
  503.     WHEN opt='?' & menuflag THEN CALL help('MAIN')
  504.     OTHERWISE NOP
  505.   END
  506. END
  507. SIGNAL LOGOUT
  508. EXIT
  509.  
  510.  
  511.  
  512. /* FUNCTIONS */
  513.  
  514.  
  515. do_F:
  516. IF menu='FILE' | menu='ALL' THEN
  517.   DO
  518.     IF STORAGE()<(bbsprefs.15+100000) | GETCLIP('BBS_libs.0')~='' THEN
  519.       DO
  520.         SAY
  521.         SAY 'Sorry! Not enough memory left for background archiving.'
  522.         SAY 'Please try again in 10 minutes or so.'
  523.         SAY
  524.         RETURN
  525.       END
  526.     DO i=0 TO libs.0
  527.       CALL SETCLIP('BBS_libs.'i,libs.i)
  528.     END
  529.     IF Make_BrowseList.baud(name colorflag files.0)=0 THEN
  530.       IF emailonline>=0 THEN emailonline=emailonline+1
  531.     DO i=0 TO libs.0
  532.       CALL SETCLIP('BBS_libs.'i)
  533.     END
  534.   END
  535. ELSE IF menu~='ALL' THEN menu='FILE'
  536. RETURN
  537.  
  538.  
  539. cleanstring:
  540. PARSE ARG nflag':'cstr
  541. bot=TRIM(XRANGE(,' '))
  542. bot=COMPRESS(bot,'1B'x)  /* ESC for ANSI */
  543. top=XRANGE('7F'x)
  544. IF nflag=1 THEN
  545.   DO
  546.     bot=bot||XRANGE('!','@')'[\]`~{:}'
  547.     cstr=TRANSLATE(UPPER(cstr),' ','_')
  548.   END
  549. cstr=COMPRESS(cstr,bot||top)
  550. IF nflag~=2 THEN cstr=STRIP(cstr)
  551. IF nflag=1 THEN cstr=SPACE(cstr,1,'_')
  552. RETURN cstr
  553.  
  554.  
  555. showtext:
  556. PARSE ARG arg .
  557. IF EXISTS(arg) THEN
  558.   DO
  559.     CALL readlines(arg 1)
  560.     CALL seelines(1)
  561.     nonstop=0
  562.     CALL waiting()
  563.   END
  564. RETURN
  565.  
  566.  
  567. doGrin:
  568. IF ~EXISTS(bbspath'rexxDoors/Grin_du_Jour.rexx') THEN RETURN 0
  569. CALL setdir(bbspath'rexxDoors')
  570. temp=Grin_du_Jour.rexx()
  571. SAY
  572. RETURN temp
  573.  
  574.  
  575. do_quick:
  576. ARG flag .
  577. IF FIND(UPPER(data.8),'QUICK')=0 THEN
  578.   DO
  579.     SAY
  580.     SAY 'The QUICK option is OFF in your current settings.'
  581.     SAY
  582.     SAY 'Setting the QUICK option to ON will allow you to tell the BBS to'
  583.     SAY 'make a .lha archive of all new bbs activity since your last call.'
  584.     SAY
  585.     SAY 'This archive can then be read (and replied to, and files can be'
  586.     SAY 'uploaded and downloaded) using 'pen3'bbsQUICK.rexx'def', the offline read/reply'
  587.     SAY 'module for BBBBS, which is available here in the file libraries.'
  588.     SAY
  589.     IF getinput(1 1 'Turn the QUICK option ON? (Ny) > ')~='Y' THEN RETURN
  590.     data.8=data.8 'QUICK'
  591.     CALL saveData(0)
  592.   END
  593. ELSE IF flag=1 THEN
  594.   DO
  595.     IF getinput(1 1 'Turn the QUICK option OFF? (Ny) > ')='Y' THEN
  596.       DO 
  597.         temp=data.8
  598.         data.8=''
  599.         DO i=1 TO WORDS(temp)
  600.           IF WORD(temp,i)~='QUICK' THEN data.8=STRIP(data.8 WORD(temp,i))
  601.         END
  602.         ADDRESS COMMAND 'c:delete' bbspath'EmailFiles/'name'/QUICK_#?'
  603.         RETURN
  604.       END
  605.   END
  606. IF getinput(1 1 'Edit your QUICK exclude list? (Ny) > ')='Y' THEN
  607.   DO
  608.     SAY
  609.     SAY 'You may EXCLUDE any of these from your QUICK archives.'
  610.     SAY pen3||LEFT('-',74,'-')||def
  611.     temp=LEFT(' ',7)
  612.     SAY temp'HELLO          - Pre-logon message.'
  613.     SAY temp'WELCOME        - Post-logon message.'
  614.     SAY temp'GOODBYE        - Logoff message.'
  615.     SAY temp'HOURLY         - Average-Minutes-Per-Hour usage graph.'
  616.     SAY temp'STATS.BBS      - Most of the Z command from the main menu.'
  617.     SAY temp'filename       - ANY filename in the Information area.'
  618.     SAY temp'MESSAGES       - New conference messages.'
  619.     SAY temp'FILELIST       - New file descriptions.'
  620.     SAY pen3||LEFT('-',74,'-')||def
  621.     SAY 'Enter a space separated list of what you wish to exclude.'
  622.     SAY pen3'Exclude:'def data.26
  623.     temp=getinput(1 0 pen3'Exclude: 'def)
  624.     IF temp='' & data.26~='' THEN
  625.       DO
  626.         IF getinput(1 1 'Clear the QUICK exclude list? (nY) > ')~='N' THEN
  627.           data.26=''
  628.       END
  629.     ELSE data.26=temp
  630.     temp='Your QUICK archives will exclude'pen3
  631.     IF data.26='' THEN temp=temp 'nothing!'
  632.     ELSE temp=temp data.26
  633.     SAY temp||def
  634.     CALL savedata(0)
  635.     SAY
  636.   END
  637. IF GETCLIP('BBS_'name)~='' THEN
  638.   DO
  639.     SAY
  640.     SAY 'The QUICK routines are still working on your archive...'
  641.     SAY 'Please try again later.'
  642.     SAY
  643.     RETURN
  644.   END
  645. quickdir=bbspath'EmailFiles/'name
  646. CALL MAKEDIR(quickdir)
  647. CALL setdir(quickdir)
  648. IF getinput(1 1 'Do you have a QUICKIN file to upload? (Ny) > ')='Y' THEN
  649.   DO
  650.     arg='QUICKIN.lha'
  651.     ul=2
  652.     DO WHILE ul=2
  653.       ul=uload(0)
  654.     END
  655.   END
  656. IF EXISTS(bbspath'EmailFiles/'name'/QUICKIN.lha') & level>=sysoplevel THEN
  657.   IF getinput(1 1 'Process your QUICKIN archive [N]ow or at [L]ogoff? (Ln) > ')='N' THEN
  658.     DO
  659.       SAY
  660.       SAY 'Please wait, processing QUICKIN archive...'
  661.       CALL bbsQUICKIN.rexx(name level sysoplevel bbsprefs.6)
  662.       CALL checkclips()
  663.       CALL loadData()
  664.       SAY
  665.     END
  666. IF GETCLIP('BBS_'name)='QUICK' THEN
  667.   DO
  668.     SAY
  669.     SAY 'The QUICK routines are still working on your file(s)...'
  670.     SAY
  671.     RETURN
  672.   END
  673. arg='RAM:dirlist'
  674. ADDRESS COMMAND 'C:list >'arg quickdir'/QUICK_#? DATES'
  675. IF WORD(STATEF(arg),2)>80 THEN
  676.   DO
  677.     CALL readlines(arg 1)
  678.     CALL seelines(0)
  679.     SAY
  680.   END
  681. efiles=UPPER(SHOWDIR(quickdir))
  682. DO qi=1 TO WORDS(efiles)
  683.   qarg=WORD(efiles,qi)
  684.   IF LEFT(qarg,6)='QUICK_' & RIGHT(qarg,4)='.LHA' THEN
  685.     DO
  686.       SAY qarg 'is' WORD(STATEF(qarg),2) 'bytes.'
  687.       arg=qarg
  688.       DO WHILE dload()=1
  689.       END
  690.       t=''
  691.       DO WHILE t~='N' & t~='Y'
  692.         t=getinput(1 1 'Delete' qarg'? (ny) > ')
  693.       END
  694.       IF t='Y' THEN
  695.         DO
  696.           IF DELETE(quickdir'/'qarg)=1 THEN SAY qarg 'deleted.'
  697.           CALL DELETE(quickdir'/'qarg'.xdl')
  698.           qarg=COMPRESS(UPPER(qarg),'QUICK_.LHA')
  699.           CALL DELETE(bbspath'Email/'name'/BBBBS.'qarg)
  700.         END
  701.     END
  702. END
  703. arg=''
  704. SAY
  705. IF GETCLIP('BBS_'name)~='' THEN RETURN
  706. IF getinput(1 1 'Archive new BBS activity now? (Ny) > ')='Y' THEN
  707.   DO
  708.     CALL SETCLIP('BBS_city',city)
  709.     CALL SETCLIP('BBS_'name'_26',data.26)
  710.     IF FIND(UPPER(data.26),'STATS.BBS')=0 THEN
  711.       CALL SETCLIP('BBS_statsarg',emailonline grand grand2 files.0)
  712.     IF FIND(UPPER(data.26),'MESSAGES')=0 THEN
  713.       CALL SETCLIP('BBS_'name'_22',data.22)
  714.     CALL MAKEDIR(bbspath'EmailFiles/'name)
  715.     CALL showmarked(0)
  716.     ADDRESS AREXX bbsQUICKOUT.rexx name level lastbrowse WORD(data.16,2) data.21
  717.     IF FIND(UPPER(data.26),'MESSAGES')=0 THEN
  718.       DO
  719.         clear_marked=1
  720.         DO i=1 TO level
  721.           IF WORD(data.22,i)~=-1 THEN
  722.             lastread.i=countcheck(bbspath'Numbers/LastMessage'i 0)
  723.         END
  724.         SAY
  725.       END
  726.     IF FIND(UPPER(data.26),'FILELIST')=0 THEN
  727.       lastbrowse=countcheck(bbspath'Numbers/LastFile' 0)
  728.     newfilesdate=DATE('S') TIME()
  729.     IF writeopen(bbspath'EmailFiles/'name'/Libraries') THEN
  730.       DO
  731.         DO i=1 TO libs.0
  732.           CALL WRITELN(f,libs.i)
  733.         END
  734.         CALL CLOSE(f)
  735.       END
  736.     IF writeopen(bbspath'EmailFiles/'name'/Conferences') THEN
  737.       DO
  738.         DO i=1 TO msgs.0
  739.           CALL WRITELN(f,msgs.i)
  740.         END
  741.         CALL CLOSE(f)
  742.       END
  743.     SAY
  744.     IF getinput(1 1 'Logoff Now? (nY) > ')~='N' THEN
  745.       DO
  746.         SAY 'Your archive will be waiting next time you call...'
  747.         SAY
  748.         SIGNAL LOGOUT2
  749.       END
  750.     SAY
  751.     SAY 'Note: You now have no ''new'' files or messages (they are being archived).'
  752.     SAY
  753.     CALL saveData(1)
  754.     CALL waiting()
  755.   END
  756. ELSE
  757.   DO
  758.     SAY
  759.     IF getinput(1 1 'Logoff Now? (nY) > ')~='N' THEN SIGNAL LOGOUT2
  760.   END
  761. SAY
  762. RETURN
  763.  
  764.  
  765. killuser:
  766. IF level<=sysoplevel THEN RETURN
  767. killcount=0
  768. DO loop=1
  769.   IF arg='' THEN
  770.     DO
  771.       OPTIONS PROMPT 'RETURN=QUIT  Username to Kill: '
  772.       PULL arg
  773.     END
  774.   IF STRIP(arg)='' THEN LEAVE loop
  775.   arg=UPPER(arg)
  776.   arg=SPACE(STRIP(arg),1,'_')
  777.   IF getinput(1 1 'Really kill' arg'? (nY) > ')='N' THEN
  778.     DO
  779.       arg=''
  780.       ITERATE loop
  781.     END
  782.   SAY 'Working...'
  783.   IF readlines(bbspath'Users/'arg 1) THEN
  784.     DO
  785.       SAY 'User' arg 'not found.'
  786.       arg=''
  787.       ITERATE loop
  788.     END
  789.   IF level<=lynes.20 THEN
  790.     DO
  791.       SAY '*** Tsk! Tsk!  Your level is not greater than' arg'.'
  792.       arg=''
  793.       ITERATE loop
  794.     END
  795.   CALL DELETE(bbspath'Users/'arg)
  796.   IF EXISTS(bbspath'Email/'arg) THEN
  797.     DO
  798.       temp=WORDS(SHOWDIR(bbspath'Email/'arg))
  799.       emailonline=emailonline-temp
  800.       ADDRESS COMMAND 'C:DELETE >*' bbspath'Email/'arg 'ALL'
  801.     END
  802.   IF EXISTS(bbspath'EmailFiles/'arg) THEN
  803.     ADDRESS COMMAND 'C:DELETE >*' bbspath'EmailFiles/'arg 'ALL'
  804.   SAY 'User file, Email & EmailFiles for' arg 'have been deleted.'
  805.   killcount=killcount+1
  806.   arg=''
  807. END
  808. IF killcount=0 THEN RETURN
  809. CALL DELETE(bbspath'Lists/USERS')
  810. sortuserflag=1
  811. RETURN
  812.  
  813.  
  814. menus:
  815. SAY
  816. IF menu='NEW' THEN
  817.   DO
  818.     SAY pen6'     _________________'def
  819.     SAY pen6'  __/  'pen3'New User Menu'pen6'  \___'def
  820.     SAY pen6' |                        |'def
  821.     SAY pen6' |'def'   ['pen3'H'def']elp               'pen6'|'def
  822.     SAY pen6' |'def'   ['pen3'I'def']nformation        'pen6'|'def
  823.     SAY pen6' |'def'   ['pen3'Y'def']our user data     'pen6'|'def
  824.     SAY pen6' |'def'   ['pen3'W'def']ho is here        'pen6'|'def
  825.     SAY pen6' |'def'   ['pen3'S'def']earch user list   'pen6'|'def
  826.     SAY pen6' |'def'   ['pen3'V'def']iew user log      'pen6'|'def
  827.     SAY pen6' |'def'   ['pen3'Z'def'] bbs statistics   'pen6'|'def
  828.     SAY pen6' |'def'   ['pen3','def'] hourly stats     'pen6'|'def
  829.     SAY pen6' |'def'   ['pen3'X'def'] toggle menus     'pen6'|'def
  830.     SAY pen6' |'def'   ['pen3'#'def'] toggle color     'pen6'|'def
  831.     SAY pen6' |'def'   ['pen3'!'def'] YELL for SYSOP   'pen6'|'def
  832.     SAY pen6' |'def'   ['pen3'C'def']omment to SYSOP   'pen6'|'def
  833.     SAY pen6' |'def'   ['pen3'G'def']oodbye (hangup)   'pen6'|'def
  834.     SAY pen6' |________________________|'def
  835.   END
  836. ELSE IF menu='MSG' THEN
  837.   DO
  838.     SAY pen6'       ____________'def
  839.     SAY pen6'  ____/  'pen3'Messages'pen6'  \_____'def
  840.     SAY pen6' |                       |'def
  841.     SAY pen6' |'def'   ['pen3'H'def']elp              'pen6'|'def
  842.     SAY pen6' |'def'   ['pen3'P'def']ost messages     'pen6'|'def
  843.     SAY pen6' |'def'   ['pen3'R'def']ead messages     'pen6'|'def
  844.     SAY pen6' |'def'   ['pen3'S'def']earch messages   'pen6'|'def
  845.     SAY pen6' |'def'   ['pen3'E'def']mail (private)   'pen6'|'def
  846.     SAY pen6' |'def'   ['pen3'C'def']omment to SYSOP  'pen6'|'def
  847.     SAY pen6' |'def'   ['pen3'QUICK'def'] options     'pen6'|'def
  848.     SAY pen6' |'def'   ['pen3'FL'def'] Friends List   'pen6'|'def
  849.     SAY pen6' |'def'   ['pen3'!'def'] YELL for SYSOP  'pen6'|'def
  850. IF(level>sysoplevel) THEN DO
  851.     SAY pen6' |'def'   ['pen3'^'def'] view BBS logs   'pen6'|'def
  852.     SAY pen6' |'def'   ['pen3')'def'] email report    'pen6'|'def
  853.     SAY pen6' |'def'   ['pen3'='def'] level report    'pen6'|'def
  854.     SAY pen6' |'def'   ['pen3';'def'] change username 'pen6'|'def;END
  855. IF(level=99) THEN DO
  856.     SAY pen6' |'def'   ['pen3'~'def'] online editor   'pen6'|'def
  857.     SAY pen6' |'def'   ['pen3'@'def'] dos shell       'pen6'|'def;END
  858.     SAY pen6' |'def'   ['pen3'F'def']iles menu        'pen6'|'def
  859.     SAY pen6' |'def'   ['pen3'.'def'] main menu       'pen6'|'def
  860.     SAY pen6' |_______________________|'def
  861.   END
  862. ELSE IF menu='FILE' THEN
  863.   DO
  864.     SAY pen6'         _________'def
  865.     SAY pen6'  ______/  'pen3'Files'pen6'  \_______'def
  866.     SAY pen6' |                        |'def
  867.     SAY pen6' |'def'   ['pen3'A'def']lphabetic list    'pen6'|'def
  868.     SAY pen6' |'def'   ['pen3'H'def']elp               'pen6'|'def
  869.     SAY pen6' |'def'   ['pen3'B'def']rowse filenotes   'pen6'|'def
  870.     SAY pen6' |'def'   ['pen3'N'def']ew files list     'pen6'|'def
  871.     SAY pen6' |'def'   ['pen3'L'def']ist by Library    'pen6'|'def
  872.     SAY pen6' |'def'   ['pen3'F'def']ilelist archives  'pen6'|'def
  873.     SAY pen6' |'def'   ['pen3'S'def']earch files       'pen6'|'def
  874.     SAY pen6' |'def'   ['pen3'U'def']pload             'pen6'|'def
  875.     SAY pen6' |'def'   ['pen3'D'def']ownload           'pen6'|'def
  876.     SAY pen6' |'def'   ['pen3'+'def'] Extra Devices    'pen6'|'def
  877. IF(level>sysoplevel) THEN DO
  878.     SAY pen6' |'def'   ['pen3'K'def']ill a user        'pen6'|'def
  879.     SAY pen6' |'def'   ['pen3'%'def'] edit filenote    'pen6'|'def
  880.     SAY pen6' |'def'   ['pen3'('def'] file report      'pen6'|'def
  881.     SAY pen6' |'def'   ['pen3';'def'] change username  'pen6'|'def;END
  882. IF(level=99) THEN
  883.     SAY pen6' |'def'   ['pen3'@'def'] dos shell        'pen6'|'def
  884.     SAY pen6' |'def'   ['pen3'M'def']essages menu      'pen6'|'def
  885.     SAY pen6' |'def'   ['pen3'.'def'] main menu        'pen6'|'def
  886.     SAY pen6' |________________________|'def
  887.   END
  888. ELSE IF menu='MAIN' THEN
  889.   DO
  890.     SAY pen6'       _____________'def
  891.     SAY pen6'  ____/  'pen3'Main Menu'pen6'  \_____'def
  892.     SAY pen6' |                        |'def
  893.     SAY pen6' |'def'   ['pen3'H'def']elp               'pen6'|'def
  894.     SAY pen6' |'def'   ['pen3'I'def']nfomation         'pen6'|'def
  895.     SAY pen6' |'def'   ['pen3'J'def']ump to doorways   'pen6'|'def
  896.     SAY pen6' |'def'   ['pen3'Y'def']our user data     'pen6'|'def
  897.     SAY pen6' |'def'   ['pen3'W'def']ho is here list   'pen6'|'def
  898.     SAY pen6' |'def'   ['pen3'S'def']earch userlist    'pen6'|'def
  899.     SAY pen6' |'def'   ['pen3'O'def']ther users info   'pen6'|'def
  900.     SAY pen6' |'def'   ['pen3'V'def']iew user log      'pen6'|'def
  901.     SAY pen6' |'def'   ['pen3'X'def']pert (no menus)   'pen6'|'def
  902.     SAY pen6' |'def'   ['pen3'#'def'] toggle colors    'pen6'|'def
  903.     SAY pen6' |'def'   ['pen3'$'def'] toggle menu(s)   'pen6'|'def
  904.     SAY pen6' |'def'   ['pen3'&'def'] user profiles    'pen6'|'def
  905.     SAY pen6' |'def'   ['pen3'Z'def'] bbs statistics   'pen6'|'def
  906.     SAY pen6' |'def'   ['pen3','def'] hourly stats     'pen6'|'def
  907.     SAY pen6' |'def'   ['pen3'G'def']oodbye (hangup)   'pen6'|'def
  908.     SAY pen6' |'def'   ['pen3'F'def']iles menu         'pen6'|'def
  909.     SAY pen6' |'def'   ['pen3'M'def']essages menu      'pen6'|'def
  910.     SAY pen6' |________________________|'def
  911.   END
  912. ELSE IF menu='ALL' THEN
  913.   DO
  914.     SAY pen6'     __________________________________________________________'def
  915.     SAY pen6'  __/   'pen3'Main Menu            File Menu          Message Menu 'pen6'  \__'def
  916.     SAY pen6' |                                                                |'def
  917.     SAY pen6' |'def' ['pen3'H'def']elp               ['pen3'A'def']lphabetical list  ['pen3'P'def']ost messages      'pen6'|'def
  918.     SAY pen6' |'def' ['pen3'I'def']nformation        ['pen3'B'def']rowse filenotes   ['pen3'R'def']ead messages      'pen6'|'def
  919.     SAY pen6' |'def' ['pen3'Z'def'] bbs statiZtics   ['pen3'L'def']ist by Library    ['pen3'E'def']mail (private)    'pen6'|'def
  920.     SAY pen6' |'def' ['pen3'Y'def']our user data     ['pen3'N'def']ew files          ['pen3'C'def']omment to SYSOP   'pen6'|'def
  921.     SAY pen6' |'def' ['pen3'O'def']ther users info   ['pen3'F'def']ilelist archiver  ['pen3'!'def'] YELL for SYSOP   'pen6'|'def
  922.     SAY pen6' |'def' ['pen3'J'def']ump to doorways   ['pen3'+'def'] Extra Devices    ['pen3'X'def']pert (no menus)   'pen6'|'def
  923.     SAY pen6' |'def' ['pen3'S'def']earch menu        ['pen3'D'def']ownload           ['pen3'$'def'] toggle menu(s)   'pen6'|'def
  924.     SAY pen6' |'def' ['pen3'&'def'] user profiles    ['pen3'U'def']pload             ['pen3'#'def'] toggle colors    'pen6'|'def
  925.     SAY pen6' |'def' ['pen3'V'def']iew user log      ['pen3'T'def']ransfer protocol  ['pen3','def'] hourly stats     'pen6'|'def
  926.     SAY pen6' |'def' ['pen3'G'def']oodbye (logoff)   ['pen3'QUICK'def'] options      ['pen3'FL'def'] Friends List    'pen6'|'def
  927. IF(level>sysoplevel) THEN DO
  928.     SAY pen6' |'def' ['pen3'K'def']ill a user        ['pen3'%'def'] edit filenote    ['pen3'='def'] level report     'pen6'|'def
  929.     SAY pen6' |'def' ['pen3'^'def'] view BBS logs    ['pen3'('def'] file report      ['pen3';'def'] change username  'pen6'|'def;END
  930. IF(level=99) THEN
  931.     SAY pen6' |'def' ['pen3'~'def'] online editor    ['pen3'@'def'] dos shell        ['pen3')'def'] email report     'pen6'|'def
  932.     SAY pen6' |________________________________________________________________|'def
  933.   END
  934. SAY
  935. RETURN
  936.  
  937.  
  938. help:
  939. ARG helppath .
  940. SAY
  941. SAY 'For more detailed help, use ['pen3'I'def']nformation commmand to read BBBBS.COMMANDS.'
  942. IF helppath='MAIN' THEN
  943.   SAY 'Commands available from the' pen3||menu||def 'menu:'
  944. frontend=bbspath'BBS_HELP/'helppath
  945. backend='.USER'
  946. IF level=0 THEN backend='.NEW'
  947. ELSE IF level=99 THEN backend='.SUPER'
  948. ELSE IF level>sysoplevel THEN backend='.SYSOP'
  949. CALL showtext(frontend||backend)
  950. RETURN
  951.  
  952.  
  953. waiting:
  954. IF waitchar='Q' THEN
  955.   DO
  956.     waitchar=''
  957.     RETURN
  958.   END
  959. waitchar=''
  960. IF nonstop=1 THEN RETURN
  961. OPTIONS PROMPT pen3'                       RETURN=Continue  'def
  962. PULL waitchar
  963. CALL cleanline(1)
  964. RETURN
  965.  
  966.  
  967. waiting2:
  968. IF nonstop=1 THEN RETURN 0
  969. waitchar=getinput(1 1 pen3'   Q=Quit   N=Non-Stop   RETURN=Continue  'def)
  970. IF waitchar='N' THEN
  971.   DO
  972.     nonstop=1
  973.     SAY pen3'To EXIT non-stop scrolling of text, press CTRL-E        'def
  974.     SAY
  975.     CALL DELAY(100)
  976.     waitchar=''
  977.   END
  978. CALL cleanline(1)
  979. IF waitchar='Q' THEN RETURN 1
  980. RETURN 0
  981.  
  982.  
  983. busywait:
  984. ARG bii bi bt 
  985. IF bbsprefs.21=0 THEN RETURN
  986. IF bi<1 THEN
  987.   DO
  988.     CALL WRITECH(STDOUT,'080808'x)
  989.     RETURN
  990.   END
  991. IF bi=1 THEN CALL WRITECH(STDOUT,'   ')
  992. IF bi//(bii%2)~=0 THEN RETURN
  993. b=bi//bii
  994. IF b=0 | b=bii%2 THEN
  995.   DO
  996.     tp=RIGHT((bi*100)%bt,2)'%'
  997.     CALL WRITECH(STDOUT,'080808'x||tp)
  998.   END
  999. RETURN
  1000.  
  1001.  
  1002. cleanline:
  1003. ARG lflag .
  1004. IF colorflag~=1 & lflag=1 THEN RETURN
  1005. cline=lineup||LEFT(' ',77)
  1006. IF lflag=1 THEN cline=cline||lineup
  1007. SAY cline
  1008. RETURN
  1009.  
  1010.  
  1011. getinput:
  1012. PARSE ARG upflag' 'oneflag' 'pline
  1013. OPTIONS PROMPT pline
  1014. PARSE PULL inarg
  1015. inarg=STRIP(inarg)
  1016. IF upflag THEN inarg=UPPER(inarg)
  1017. IF oneflag THEN inarg=LEFT(inarg,1)
  1018. RETURN inarg
  1019.  
  1020.  
  1021. docity:
  1022. PARSE ARG citi
  1023. citi=TRANSLATE(citi,'          ','+-.,*/()<>')
  1024. DO i=WORDS(citi) TO 1 BY -1
  1025.   IF DATATYPE(WORD(citi,i),'N') THEN citi=STRIP(DELWORD(citi,i,1))
  1026.   IF UPPER(WORD(citi,i))='USA' THEN citi=STRIP(DELWORD(citi,i,1))
  1027. END
  1028. citi=SPACE(citi,1)
  1029. RETURN STRIP(citi)
  1030.  
  1031.  
  1032. setdir:
  1033. PARSE ARG tempdir
  1034. CALL PRAGMA('D',STRIP(tempdir))
  1035. directory=PRAGMA('D')
  1036. slash=LASTPOS('/',directory)
  1037. IF slash=0 THEN slash=LASTPOS(':',directory)
  1038. plaindir=directory
  1039. IF slash>0 THEN plaindir=SUBSTR(plaindir,slash+1)
  1040. RETURN
  1041.  
  1042.  
  1043. config:
  1044. arg='s:CONFIG.BBS'
  1045. IF ~EXISTS(arg) THEN arg='BBS:BBS_TEXT/CONFIG.BBS'
  1046. IF readlines(arg 1) THEN
  1047.   DO
  1048.     SAY 's:CONFIG.BBS and BBS:BBS_TEXT/CONFIG.BBS are both missing!'
  1049.     SIGNAL DONE2
  1050.   END
  1051. compos=POS('/*',lynes.1)
  1052. IF compos>0 THEN lynes.1=LEFT(lynes.1,compos-1)
  1053. bbsname=STRIP(lynes.1)
  1054. sysop=WORD(lynes.2,1)
  1055. compos=POS('/*',lynes.3)
  1056. IF compos>0 THEN lynes.3=LEFT(lynes.3,compos-1)
  1057. exclusion=STRIP(lynes.3)
  1058. bbsdevice=WORD(lynes.4,1)
  1059. sysoplevel=WORD(lynes.5,1)
  1060. bbspath=WORD(lynes.6,1)
  1061. IF ~EXISTS(bbspath) THEN
  1062.   DO
  1063.     SAY bbspath 'does not exist!'
  1064.     SIGNAL DONE2
  1065.   END
  1066. testchar=RIGHT(bbspath,1)
  1067. IF testchar~='/' & testchar~=':' THEN bbspath=bbspath'/'
  1068. CALL SETCLIP('BBS_path',bbspath)
  1069. msgpath=WORD(lynes.7,1)
  1070. IF ~EXISTS(msgpath) THEN
  1071.   DO
  1072.     SAY msgpath 'does not exist!'
  1073.     SIGNAL DONE2
  1074.   END
  1075. testchar=RIGHT(msgpath,1)
  1076. IF testchar~='/' & testchar~=':' THEN msgpath=msgpath'/'
  1077. CALL SETCLIP('BBS_msgpath',msgpath)
  1078. msgpath=msgpath'MSG'
  1079. libpath=WORD(lynes.8,1)
  1080. IF ~EXISTS(libpath) THEN
  1081.   DO
  1082.     SAY libpath 'does not exist!'
  1083.     SIGNAL DONE2
  1084.   END
  1085. testchar=RIGHT(libpath,1)
  1086. IF testchar~='/' & testchar~=':' THEN libpath=libpath'/'
  1087. CALL SETCLIP('BBS_libpath',libpath)
  1088. extdevs=''
  1089. DO i=1 TO WORDS(lynes.10)
  1090.   test=WORD(lynes.10,i)
  1091.   IF POS(':',test)=0 THEN ITERATE i
  1092.   IF LEFT(test,2)='/*' THEN LEAVE i
  1093.   extdevs=STRIP(extdevs test)
  1094. END
  1095. SYSTEM_MSG_LIMIT=WORD(lynes.11,1)
  1096. SYSTEM_SPACE_LIMIT=WORD(lynes.12,1)
  1097. maxidle=WORD(lynes.13,1)
  1098. maxtime=WORD(lynes.14,1)
  1099. maxbps=WORD(lynes.15,1)
  1100. IF ~DATATYPE(maxbps,'W') THEN maxbps=2400
  1101. CALL SETCLIP('BBS_baud',maxbps)
  1102. DO i=16 TO 40
  1103.   j=i-15
  1104.   bbsprefs.j=STRIP(WORD(lynes.i,1))
  1105. END
  1106. spellpath=WORD(lynes.9,1)
  1107. IF bbsprefs.5 & ~EXISTS(spellpath) THEN
  1108.   DO
  1109.     SAY spellpath 'does not exist!'
  1110.     bbsprefs.5=0
  1111.   END
  1112. IF bbsprefs.10 THEN scratch=bbspath'Scratch'
  1113. ELSE scratch='RAM:Scratch'
  1114. CALL MAKEDIR(scratch)
  1115. IF ~DATATYPE(bbsprefs.16,'W') THEN bbsprefs.16=3
  1116. extension=WORD(lynes.32,1)
  1117. arccom=lynes.33
  1118. compos=POS('/*',lynes.33)
  1119. IF compos>0 THEN lynes.33=LEFT(lynes.33,compos-1)
  1120. arccom=STRIP(lynes.33)
  1121. IF LEFT(extension,1)~='.' THEN
  1122.   DO
  1123.     extension='.lzh'
  1124.     arccom='lharc -m m'
  1125.   END
  1126. RETURN
  1127.  
  1128.  
  1129. readlogs:
  1130. IF arg='' THEN
  1131.   arg=getinput(1 0 '['pen3'RETURN'def']=TODAY, or enter Log Date ('pen3||DATE('S')||def') > ')
  1132. IF arg='' THEN arg=DATE('S')
  1133. arg=bbspath'Logs/log.'arg
  1134. CALL readlines(arg 1)
  1135. CALL seelines(0)
  1136. nonstop=0
  1137. CALL waiting()
  1138. RETURN
  1139.  
  1140.  
  1141. loadcourtesy:
  1142. IF courtesyflag=0 & courtesy='' & EXISTS(bbspath'Lists/Courtesy') THEN
  1143.   DO
  1144.     IF readopen(bbspath'Lists/Courtesy') THEN
  1145.       DO
  1146.         SAY 'Checking Courtesy List...'
  1147.         DO i=1
  1148.           line=READLN(f)
  1149.           IF EOF(f) THEN BREAK
  1150.           courtesy=courtesy UPPER(line)
  1151.         END
  1152.         CALL CLOSE(f)
  1153.         MSG ''
  1154.         MSG pen3'Courtesy List:'def
  1155.         MSG courtesy
  1156.       END
  1157.   END
  1158. RETURN
  1159.  
  1160.  
  1161. fileheader:
  1162. SAY 'Filename          Bytes File# Library         KeyWords'
  1163. SAY pen3||LEFT('=',77,'=')||def
  1164. RETURN
  1165.  
  1166.  
  1167. showalpha:
  1168. IF DATATYPE(arg,'W') THEN
  1169.   DO
  1170.     dirnum=arg
  1171.     arg=''
  1172.     IF chdir2()>0 THEN RETURN
  1173.     test='Y'
  1174.   END
  1175. ELSE
  1176.   DO
  1177.     test=getinput(1 1 'Show one library only? (Ny) > ')
  1178.     IF test='Y' THEN
  1179.       IF chdir()>0 THEN RETURN
  1180.   END
  1181.  
  1182. showalpha2:
  1183. IF test='Y' THEN filecount=WORDS(SHOWDIR(bbspath'FileNotes/'plaindir))
  1184. ELSE filecount=files.0
  1185. SAY '  'filecount 'files.'
  1186. CALL fileheader()
  1187. count=0
  1188. DO wi=1 TO alpha.0
  1189.   CALL busywait(60 wi alpha.0)
  1190.   IF test='Y' THEN
  1191.     DO
  1192.       IF count>=filecount THEN LEAVE wi
  1193.       IF UPPER(LEFT(plaindir,12))~=UPPER(LEFT(WORD(alpha.wi,5),12)) THEN
  1194.         ITERATE wi
  1195.     END
  1196.   jj=WORD(alpha.wi,4)
  1197.   IF jj>level | FIND(data.21,UPPER(dirs.jj))>0 THEN
  1198.     ITERATE wi
  1199.   CALL busywait(4 0)
  1200.   SAY LEFT(alpha.wi,76)
  1201.   count=count+1
  1202.   IF (count+2)//linesperpage=0 THEN
  1203.     IF waiting2() THEN LEAVE wi
  1204.   CALL busywait(4 1)
  1205. END
  1206. CALL busywait(4 0)
  1207. nonstop=0
  1208. IF waitchar~='Q' THEN CALL waiting()
  1209. RETURN
  1210.  
  1211.  
  1212. profiles:
  1213. prodir=bbspath'Profiles'
  1214. CALL MAKEDIR(prodir)
  1215. pros=SHOWDIR(prodir)
  1216. protxt=bbspath'BBS_TEXT/PROFILES'
  1217. IF EXISTS(protxt) THEN CALL showtext(protxt)
  1218. DO lupe=1
  1219.   SAY
  1220.   SAY '       1. Edit 'name'''s user Profile'
  1221.   SAY '       2. View a User Profile'
  1222.   SAY '       3. Search User Profiles'
  1223.   SAY '       4. Browse User Profiles'
  1224.   SAY
  1225.   temp=getinput(1 1 'Enter Selection Number > ')
  1226.   IF temp=1 THEN
  1227.     DO
  1228.       lynes.=''
  1229.       IF EXISTS(prodir'/'name) THEN
  1230.         DO
  1231.           IF readlines(prodir'/'name 1)~=0 THEN ITERATE lupe
  1232.           CALL DELETE(prodir'/'name)
  1233.         END
  1234.       ELSE lynes.0=3
  1235.       lynes.1=name
  1236.       lynes.2='Profile Last Updated:' DATE('W') DATE() TIME('C')
  1237.       lynes.3=LEFT('=',74,'=')
  1238.       IF savelines(prodir'/'name)~=0 THEN
  1239.         DO
  1240.           line='Profile for' name 'failed to save!'
  1241.           SAY line
  1242.           CALL send2log(line)
  1243.           ITERATE lupe
  1244.         END
  1245.       edtype=''
  1246.       CALL bbsEd(4 prodir'/'name)
  1247.       IF readlines(prodir'/'name 1)~=0 THEN CALL DELETE(prodir'/'name)
  1248.       IF lynes.0<4 THEN CALL DELETE(prodir'/'name)
  1249.       pros=SHOWDIR(prodir)
  1250.     END
  1251.   ELSE IF temp=2 THEN
  1252.     DO pf=1
  1253.       totpros=WORDS(pros)
  1254.       DO pfl=1 TO totpros BY 3
  1255.         pfl2=pfl+1
  1256.         pfl3=pfl+2
  1257.         pfline=pen3||RIGHT(pfl,3)||def LEFT(WORD(pros,pfl),21)
  1258.         IF pfl2<=totpros THEN
  1259.           pfline=pfline pen3||RIGHT(pfl2,3)||def LEFT(WORD(pros,pfl2),21)
  1260.         IF pfl3<=totpros THEN
  1261.           pfline=pfline pen3||RIGHT(pfl3,3)||def LEFT(WORD(pros,pfl3),21)
  1262.         SAY pfline
  1263.         IF nonstop~=1 & ((pfl3%3)//linesperpage)=0 THEN
  1264.           IF waiting(2) THEN LEAVE pfl
  1265.       END
  1266.       emnum=getinput(1 0 pen3'Select User Profile Number > 'def)
  1267.       IF DATATYPE(emnum,'W') & emnum>0 & emnum<=totpros THEN
  1268.         DO
  1269.           tmp=WORD(pros,emnum)
  1270.           IF level>sysoplevel THEN
  1271.             DO
  1272.               CALL bbsEd(1 prodir'/'tmp)
  1273.               IF readlines(prodir'/'tmp 1)~=0 THEN CALL DELETE(prodir'/'tmp)
  1274.               IF lynes.0<4 THEN CALL DELETE(prodir'/'tmp)
  1275.               pros=SHOWDIR(prodir)
  1276.             END
  1277.           ELSE CALL showtext(prodir'/'tmp)
  1278.         END
  1279.       ELSE LEAVE pf
  1280.     END
  1281.   ELSE IF temp=3 | temp=4 THEN
  1282.     DO
  1283.       searcharg=''
  1284.       nonstop=0
  1285.       IF temp=3 THEN
  1286.         DO
  1287.           searcharg=STRIP(getinput(0 0 'Enter Search Phrase > '))
  1288.           IF searcharg='' THEN ITERATE lupe
  1289.         END
  1290.       DO ui=1 TO WORDS(pros)
  1291.         pro=prodir'/'WORD(pros,ui)
  1292.         IF temp=3 THEN
  1293.           IF textsearch(pro searcharg)=0 THEN ITERATE ui
  1294.         SAY
  1295.         CALL readlines(pro 1)
  1296.         IF nonstop=1 THEN rnonstop=1
  1297.         ELSE rnonstop=0
  1298.         CALL seelines(2)
  1299.         IF rnonstop THEN nonstop=1
  1300.         ELSE IF waiting2()=1 THEN LEAVE ui
  1301.         SAY
  1302.         SAY
  1303.       END
  1304.     END
  1305.   ELSE IF temp='' | LEFT(temp,1)='Q' THEN LEAVE lupe
  1306. END
  1307. DROP pros
  1308. RETURN
  1309.  
  1310.  
  1311. otheruser:
  1312. line=''
  1313. IF level>sysoplevel THEN line='['pen3'R'def']eport or'
  1314. line=line '['pen3'D'def']etails or simple ['pen3'N'def']amelist?'
  1315. IF level>sysoplevel THEN line=line '(Dnr) > '
  1316. ELSE line=line '(Dn) > '
  1317. temp=getinput(1 1 line)
  1318. IF temp='N' THEN
  1319.   DO
  1320.     CALL showuserlist()
  1321.     RETURN
  1322.   END
  1323. ELSE IF level>sysoplevel & temp='R' THEN
  1324.   DO
  1325.     SAY
  1326.     line=''
  1327.     IF getinput(1 1 'Report on inactive users? (nY) > ')~='N' THEN
  1328.       DO
  1329.         CALL cleanline(0)
  1330.         SAY 'INACTIVE_USERS report will be in your email.'
  1331.         line='USERS '
  1332.       END
  1333.     IF getinput(1 1 'Report on actual files vs. filelists? (nY) > ')~='N' THEN
  1334.       DO
  1335.         CALL cleanline(0)
  1336.         line=line'FILES'
  1337.         line=STRIP(line getinput(1 0 'Report only files larger than (0) bytes > '))
  1338.         SAY 'FILELISTS_REPORT will be in your email.'
  1339.       END
  1340.     SAY
  1341.     ADDRESS AREXX bbsREPORT.rexx name line 
  1342.     RETURN
  1343.   END
  1344. SAY
  1345. SAY 'To allow (or not) other users to see your street address and/or phone number,'
  1346. SAY 'add (or delete) STREET and/or PHONE to the line 8 list in ['pen3'Y'def']our userfile.'
  1347. SAY
  1348. SAY 'User specification may include ? wildcard for single characters.'
  1349. SAY 'ie,' pen3's?n'def 'will return all user names containing ''son'', ''sen'', ''sin'', etc.'
  1350. IF arg='' THEN arg=getinput(1 0 pen3'User specification: 'def)
  1351. IF arg='' THEN RETURN
  1352. arg=TRANSLATE(STRIP(arg),'_',' ')
  1353. CALL FileList(bbspath'Users/*'arg'*',wildlist)
  1354. line='Found' wildlist.0 'match'
  1355. IF wildlist.0~=1 THEN line=line'es'
  1356. SAY line'.'
  1357. IF wildlist.0<1 THEN RETURN
  1358. totlines=0
  1359. nextpagebreak=linesperpage-3
  1360. extrainfo=0
  1361. IF level>sysoplevel THEN
  1362.   DO
  1363.     IF getinput(1 1 'Display -sysop only- information? (nY) > ')~='N' THEN
  1364.       extrainfo=1
  1365.   END
  1366. DO i=1 TO wildlist.0
  1367.   CALL readlines(wildlist.i 1)
  1368.   SAY 
  1369.   totlines=totlines+6
  1370.   SAY bak2' 'SUBSTR(wildlist.i,LASTPOS('/',wildlist.i)+1)' 'def
  1371.   SAY lynes.1
  1372.   IF FIND(UPPER(lynes.8),'STREET')>0 THEN
  1373.     DO
  1374.       totlines=totlines+1
  1375.       SAY lynes.2
  1376.     END
  1377.   SAY lynes.3
  1378.   IF FIND(UPPER(lynes.8),'PHONE')>0 THEN
  1379.     DO
  1380.       totlines=totlines+1
  1381.       SAY lynes.4
  1382.     END
  1383.   SAY 'Last time on' bbsname':' DATE(,WORD(lynes.13,1),'S') WORD(lynes.13,2)
  1384.   SAY pen3'Interests:'def lynes.10
  1385.   IF extrainfo THEN
  1386.     DO
  1387.       SAY pen3'   up:'def lynes.14
  1388.       SAY pen3' down:'def lynes.15
  1389.       temptot=0
  1390.       DO j=1 TO WORDS(lynes.23)
  1391.         IF DATATYPE(WORD(lynes.23,j),'W') THEN temptot=temptot+WORD(lynes.23,j)
  1392.       END
  1393.       SAY pen3' writ:'def temptot 'public messages.'
  1394.       SAY pen3'level:'def lynes.20
  1395.       totlines=totlines+4
  1396.       IF lynes.21~='' THEN
  1397.         DO
  1398.           totlines=totlines+1
  1399.           SAY pen3'excluded dirs:'def lynes.21
  1400.         END
  1401.     END
  1402.   IF nonstop~=1 & totlines>=nextpagebreak THEN
  1403.     DO
  1404.       IF waiting2() THEN LEAVE i
  1405.       nextpagebreak=totlines+linesperpage-5
  1406.     END
  1407. END
  1408. nonstop=0
  1409. DROP wildlist.
  1410. IF waitchar~='Q' THEN CALL waiting()
  1411. RETURN
  1412.  
  1413.  
  1414. changename:
  1415. ARG cname
  1416. IF level<=sysoplevel THEN RETURN
  1417. IF cname='' THEN cname=getinput(1 0 'Current Username (include underscore): ')
  1418. IF readlines(bbspath'Users/'cname 1)>0 THEN RETURN
  1419. IF WORD(lynes,20)>=level THEN RETURN
  1420. CALL SETCLIP('BBS_oldname',cname)
  1421. CALL ChangeUserName.rexx()
  1422. cname=GETCLIP('BBS_newname')
  1423. CALL DELETE(bbspath'Lists/USERS')
  1424. sortuserflag=1
  1425. CALL SETCLIP('BBS_oldname')
  1426. CALL SETCLIP('BBS_newname')
  1427. RETURN cname
  1428.  
  1429.  
  1430. levelreport:
  1431. minlev=0
  1432. maxlev=99
  1433. templist=''
  1434. uname=''
  1435. newufile=bbspath'Lists/NEW_USERS'
  1436. IF EXISTS(newufile) THEN
  1437.   DO
  1438.     IF getinput(1 1 'Latest New Users Only? (nY) > ')~='N' THEN
  1439.       DO
  1440.         IF readlines(newufile 1)=0 THEN
  1441.           DO i=2 TO lynes.0
  1442.             templist=STRIP(templist WORD(lynes.i,3))
  1443.           END
  1444.       END
  1445.     ELSE newufile=''
  1446.   END
  1447. ELSE newufile=''
  1448. IF newufile='' THEN
  1449.   DO
  1450.     minlev=getinput(1 0 'Minimum level? (0) > ')
  1451.     maxlev=getinput(1 0 'Maximum level? (99) > ')
  1452.     IF ~DATATYPE(minlev,'W') THEN minlev=0
  1453.     IF ~DATATYPE(maxlev,'W') THEN maxlev=99
  1454.     IF minlev<0 | minlev>99 THEN minlev=0
  1455.     IF maxlev<0 | maxlev>99 THEN maxlev=99
  1456.     templist=userlist
  1457.   END
  1458. DO levi=1 TO WORDS(templist)
  1459.   arg=bbspath'Users/'WORD(templist,levi)
  1460.   CALL readlines(arg 1)
  1461.   lt=WORD(lynes.20,1)
  1462.   IF ~DATATYPE(lt,'W') THEN lt=0
  1463.   IF lt<minlev | lt>maxlev THEN ITERATE levi
  1464.   line=lt WORD(templist,levi)
  1465.   SAY line
  1466.   IF newufile~='' | lt<10 THEN
  1467.     DO
  1468.       SAY line
  1469.       DO levj=1 TO 12
  1470.         SAY pen3'  'lynes.levj||def
  1471.       END
  1472.       SAY pen3'  'lynes.19||def
  1473.     END
  1474.   ELSE ITERATE levi
  1475.   lcom=''
  1476.   IF lt<10 THEN lcom='['pen3'A'def']dd or '
  1477.   lcom=lcom'['pen3'K'def']ill or ['pen3'R'def']ename or ['pen3'S'def']kip this user?'
  1478.   IF lt<10 THEN lcom=lcom' (Akrs) > '
  1479.   ELSE lcom=lcom '(krS) > '
  1480.   lcom=getinput(1 1 lcom)
  1481.   CALL cleanline(0)
  1482.   IF lcom='K' THEN
  1483.     DO
  1484.       arg=WORD(templist,levi)
  1485.       CALL killuser()
  1486.     END
  1487.   ELSE IF lcom='R' THEN
  1488.     DO
  1489.       newname=changename(WORD(templist,levi))
  1490.       IF newname~='' & newname~=WORD(templist,levi) THEN
  1491.         DO
  1492.           temp=WORDINDEX(templist,levi+1)
  1493.           rtemp=''
  1494.           IF temp>0 THEN rtemp=SUBSTR(templist,temp)
  1495.           temp=WORDINDEX(templist,levi)
  1496.           templist=''
  1497.           IF temp>2 THEN templist=STRIP(LEFT(templist,temp-1))
  1498.           templist=STRIP(templist newname rtemp)
  1499.           userlist=userlist newname
  1500.         END
  1501.       levi=levi-1
  1502.       CALL SETCLIP('BBS_newname')
  1503.     END
  1504.   ELSE IF lcom~='S' & lt<10 THEN
  1505.     DO
  1506.       IF readopen(bbspath'BBS_TEXT/DEF.MEMBER') THEN
  1507.         DO
  1508.           DO lvi=1 TO 22
  1509.             line=READLN(f)
  1510.             IF lvi=11 THEN lynes.11=line
  1511.             IF lvi=20 THEN lynes.20=line
  1512.             IF lvi=21 THEN lynes.21=line
  1513.           END
  1514.           lynes.22=line
  1515.           CALL CLOSE(f)
  1516.           edtype=''
  1517.           IF bbsprefs.25=1 THEN
  1518.             DO
  1519.               SAY
  1520.               IF DATATYPE(lynes.20,'W') THEN
  1521.                 DO
  1522.                   lynes.22=''
  1523.                   lynes.23=''
  1524.                   SAY 'Setting message counters to last 10 messages in each conference...'
  1525.                   DO i=1 TO lynes.20
  1526.                     num=countcheck(bbspath'Numbers/LastMessage'i 0)-10
  1527.                     IF num<0 | msg.i.0<10 THEN num=0
  1528.                     lynes.22=lynes.22 num
  1529.                     lynes.23=lynes.23 0
  1530.                   END
  1531.                 END
  1532.               ELSE SAY 'Bad default level in BBS_TEXT/DEF.MEMBER file!'
  1533.               SAY 'Setting file counter to last file uploaded...'
  1534.               lynes.16=countcheck(bbspath'Numbers/LastFile' 0)
  1535.               lynes.16=lynes.16 '19900101 00:00:00'
  1536.             END
  1537.           lynes.0=27
  1538.           CALL savelines(arg)
  1539.           SAY lynes.20 WORD(templist,levi) 'has been made a member.'
  1540.         END
  1541.       ELSE SAY 'You need a default member file in BBS_TEXT!  ( BBS_TEXT/DEF.MEMBER )'
  1542.     END
  1543.   IF lcom~='K' & lcom~='R' & newufile~='' THEN
  1544.     DO
  1545.       nlt=getinput(1 0 lynes.20 'Enter new level or blank for no change. > ')
  1546.       IF DATATYPE(nlt,'W') THEN
  1547.         DO
  1548.           lynes.20=nlt
  1549.           CALL savelines(arg)
  1550.         END
  1551.       CALL writenew()
  1552.     END
  1553. END
  1554. IF newufile~='' & EXISTS(newufile) THEN
  1555.   IF getinput(1 1 'Delete NEW_USERS file? (nY) > ')~='N' THEN CALL DELETE(newufile)
  1556. IF EXISTS(bbspath'Lists/CBV_USERS') THEN
  1557.   IF getinput(1 1 'Delete CBV_USERS file? (nY) > ')~='N' THEN
  1558.     CALL DELETE(bbspath'Lists/CBV_USERS')
  1559. DROP templist
  1560. RETURN
  1561.  
  1562.  
  1563. writenew:
  1564. arg=WORD(templist,levi)
  1565. IF getinput(1 1 'Write' arg 'an email message? (nY) > ')~='N' THEN
  1566.   DO
  1567.     IF EXISTS(bbspath'BBS_TEXT/EMAIL_WELCOME') THEN
  1568.       IF getinput(1 1 'Use default welcome? (nY) > ')~='N' THEN replysubj='|@NEW@|'
  1569.     CALL editor('MAIL' arg)
  1570.   END
  1571. RETURN
  1572.  
  1573.  
  1574. filereport:
  1575. SAY 'Searching for mismatches between files and filenotes...'
  1576. DO i=1 TO sysoplevel+1
  1577.   IF dirs.i='' THEN ITERATE
  1578.   SAY dirs.i'                               'lineup
  1579.   rfiles=SHOWDIR(libpath||dirs.i)
  1580.   rnotes=SHOWDIR(bbspath'FileNotes/'dirs.i)
  1581.   IF WORDS(rfiles)~=WORDS(rnotes) THEN
  1582.     DO
  1583.       line='Compare files & filenotes in'pen3 dirs.i||def'. '
  1584.       DO j=1 TO WORDS(rfiles)
  1585.         IF FIND(UPPER(rnotes),UPPER(WORD(rfiles,j)))=0 THEN
  1586.           line=line WORD(rfiles,j)
  1587.       END
  1588.       SAY line
  1589.     END
  1590. END
  1591. SAY '07'x
  1592. CALL waiting()
  1593. RETURN
  1594.  
  1595.  
  1596. mailreport:
  1597. SAY 'Checking ALL pending Email...'
  1598. SAY pen3' - Use CTRL-E to Exit -'def
  1599. SAY
  1600. mailrep=SHOWDIR(bbspath'Email','D')
  1601. mailfil=SHOWDIR(bbspath'EmailFiles','D')
  1602. lastemail=WORD(data.17,3)
  1603. IF ~DATATYPE(lastemail,'W') THEN lastemail=0
  1604. IF lastemail=countcheck(bbspath'Numbers/LastMail' 0) THEN
  1605.   DO
  1606.     DROP mailrep. mailfil.
  1607.     RETURN
  1608.   END
  1609. mailynes.=''
  1610. mk=0
  1611. DO mi=1 TO WORDS(mailrep)
  1612.   muser=WORD(mailrep,mi)
  1613.   IF muser=sysop | muser=name THEN ITERATE mi
  1614.   mlist=SHOWDIR(bbspath'Email/'muser)
  1615.   IF WORDS(mlist)>0 THEN SAY lineup||RIGHT(muser,40)
  1616.   DO mj=1 TO WORDS(mlist)
  1617.     fuser=WORD(mlist,mj)
  1618.     IF POS(sysop,fuser)>0 THEN ITERATE mj
  1619.     IF logonflag=0 THEN
  1620.       DO
  1621.         mk=mk+1
  1622.         mailynes.mk=pen3||LEFT(muser,20) 'from'def LEFT(fuser,20) DATE(,WORD(STATEF(bbspath'Email/'muser'/'fuser),5),'I')
  1623.       END
  1624.     IF POS(sysop,fuser)=0 & POS(name,fuser)=0 THEN
  1625.       DO
  1626.         testnum=RIGHT(fuser,LENGTH(fuser)-LASTPOS('.',fuser))
  1627.         IF testnum>emailnum THEN emailnum=testnum
  1628.         IF testnum>lastemail THEN
  1629.           DO
  1630.             CALL showtext(bbspath'Email/'muser'/'fuser)
  1631.             SAY
  1632.             SAY
  1633.             IF waitchar='Q' THEN LEAVE mi
  1634.           END
  1635.       END
  1636.   END
  1637.   IF logonflag=0 & FIND(mailfil,muser)>0 THEN
  1638.     DO
  1639.       efilelist=SHOWDIR(bbspath'EmailFiles/'muser)
  1640.       IF WORDS(efilelist)>0 THEN
  1641.         DO
  1642.           mk=mk+1
  1643.           mailynes.mk=pen3||LEFT(muser,20) 'emailfiles'def efilelist
  1644.         END
  1645.     END
  1646. END
  1647. data.17=WORD(data.17,1) WORD(data.17,2) countcheck(bbspath'Numbers/LastMail' 0)
  1648. IF mk>0 THEN
  1649.   DO
  1650.     lynes.0=mk
  1651.     DO mi=1 TO mk
  1652.       lynes.mi=mailynes.mi
  1653.     END
  1654.     CALL seelines(1)
  1655.     nonstop=0
  1656.     CALL waiting()
  1657.   END
  1658. ELSE SAY 'No unseen Email pending.'
  1659. DROP mailrep. mailfil. mailynes. mlist
  1660. RETURN
  1661.  
  1662.  
  1663. sortdoors:
  1664. IF ~DATATYPE(jdoors.0,'W') THEN doors.0=0
  1665. IF WORDS(SHOWDIR(bbspath'rexxDoors','F'))~=doors.0 THEN
  1666.   DO
  1667.     jdoors.=''
  1668.     doorlist=SHOWDIR(bbspath'rexxDoors','F')
  1669.     doors.=''
  1670.     doors.0=WORDS(doorlist)
  1671.     DO i=1 TO doors.0
  1672.       doors.i=WORD(doorlist,i)
  1673.     END
  1674.     SAY 'Sorting..'lineup
  1675.     CALL QSORT(1,doors.0,doors)
  1676.     jdoors.0=doors.0%3
  1677.     IF (doors.0//3)>0 THEN jdoors.0=jdoors.0+1
  1678.     DO i=1 TO jdoors.0
  1679.       DO j=0 TO 2
  1680.         k=i+j*jdoors.0
  1681.         IF k<=doors.0 THEN
  1682.           DO
  1683.             jdoors.i=jdoors.i' 'LEFT(RIGHT(k,3)'.' LEFT(doors.k,LENGTH(doors.k)-5),24)
  1684.             dcount=WORD(STATEF(bbspath'rexxDoors/'doors.k),8)
  1685.             jdoors.i.0=jdoors.i.0||LEFT(RIGHT(dcount,5) LEFT(doors.k,LENGTH(doors.k)-5),24)' '
  1686.           END
  1687.       END
  1688.     END
  1689.   END
  1690. RETURN 0
  1691.  
  1692.  
  1693. jump2rexx:
  1694. CALL sortdoors()
  1695. temp=1
  1696. readcount=-1
  1697. DO doorloop=1
  1698.   IF temp=0 THEN
  1699.     DO
  1700.       IF readcount~=-1 THEN
  1701.         DO
  1702.           doors.0=''
  1703.           CALL sortdoors()
  1704.         END
  1705.       SAY CENTER('- Number of accesses per file -',75)
  1706.     END
  1707.   SAY pen3||LEFT('-',75,'-')||def
  1708.   DO jd=1 TO jdoors.0
  1709.     IF temp=0 THEN SAY jdoors.jd.0
  1710.     ELSE SAY jdoors.jd
  1711.     IF jd//linesperpage=0 THEN CALL waiting()
  1712.     IF waitchar='Q' THEN LEAVE doorloop
  1713.   END
  1714.   IF temp=0 THEN
  1715.     DO
  1716.       CALL waiting()
  1717.       temp=1
  1718.       ITERATE doorloop
  1719.     END
  1720.   temp=getinput(1 0 pen3'Select Application Number. 0=Stats > 'def)
  1721.   IF temp=0 THEN ITERATE doorloop
  1722.   IF ~DATATYPE(temp,'W') | temp<1 | temp>doors.0 THEN LEAVE doorloop
  1723.   arg=doors.temp
  1724.   IF GETCLIP('BBS_door')=arg THEN
  1725.     DO
  1726.       SAY 'That door is in use!'
  1727.       ITERATE doorloop
  1728.     END
  1729.   CALL SETCLIP('BBS_localdoor',arg)
  1730.   readcount=WORD(STATEF(bbspath'rexxDoors/'arg),8)
  1731.   IF ~DATATYPE(readcount,'W') THEN readcount=0
  1732.   ADDRESS COMMAND 'C:filenote' bbspath'rexxDoors/'arg readcount+1
  1733.   curdir=PRAGMA('D')
  1734.   CALL setdir(bbspath'rexxDoors')
  1735.   bbspath'rexxDoors/'doors.temp name winnings 0 colorflag 6000
  1736.   CALL setdir(curdir)
  1737.   CALL SETCLIP('BBS_localdoor')
  1738. END
  1739. CALL SETCLIP('BBS_localdoor')
  1740. RETURN
  1741.  
  1742.  
  1743. sortlibraries:
  1744. SAY 'Sorting Libraries...'
  1745. count=0
  1746. sdirs.=''
  1747. DO i=1 TO level
  1748.   IF dirs.i='' THEN ITERATE i
  1749.   count=count+1
  1750.   sdirs.count=dirs.i i
  1751. END
  1752. sdirs.0=count
  1753. CALL QSort(1,count,sdirs)
  1754. count=0
  1755. libs.=''
  1756. DO i=1 TO sdirs.0
  1757.   tempnum=WORD(sdirs.i,2)
  1758.   tempdir=WORD(sdirs.i,1)
  1759.   IF FIND(data.21,UPPER(tempdir))=0 THEN
  1760.     DO
  1761.       string=' '
  1762.       IF tempnum<10 THEN string=string' '
  1763.       string=string || tempnum'. 'LEFT(tempdir,14)
  1764.       count=count+1
  1765.       libs.count=string
  1766.     END
  1767. END
  1768. libs.0=count%4
  1769. IF (count//4)>0 THEN libs.0=libs.0+1
  1770. DO i=1 TO libs.0
  1771.   DO j=1 TO 3
  1772.     k=i+j*libs.0
  1773.     IF k<=count THEN libs.i=libs.i||libs.k
  1774.   END
  1775. END
  1776. DROP sdirs.
  1777. CALL sortconferences()
  1778. RETURN
  1779.  
  1780.  
  1781. sortconferences:
  1782. SAY 'Sorting Conferences...'
  1783. count=0
  1784. smsg.=''
  1785. DO i=1 TO level
  1786.   IF msg.i='' THEN ITERATE i
  1787.   count=count+1
  1788.   smsg.count=msg.i i
  1789. END
  1790. smsg.0=count
  1791. CALL QSort(1,count,smsg)
  1792. count=0
  1793. msgs.=''
  1794. DO i=1 TO smsg.0
  1795.   tempnum=WORD(smsg.i,2)
  1796.   tempdir=WORD(smsg.i,1)
  1797.   IF FIND(data.21,tempnum)=0 THEN
  1798.     DO
  1799.       string=' '
  1800.       IF tempnum<10 THEN string=string' '
  1801.       string=string || tempnum'.'
  1802.       IF WORD(data.22,tempnum)='' | WORD(data.22,tempnum)>=0 THEN
  1803.         string=string LEFT(tempdir,20)
  1804.       ELSE string=string pen3'-OFF-'def LEFT(tempdir,14)
  1805.       count=count+1
  1806.       msgs.count=string
  1807.     END
  1808. END
  1809. msgs.0=count%3
  1810. IF (count//3)>0 THEN msgs.0=msgs.0+1
  1811. DO i=1 TO msgs.0
  1812.   DO j=1 TO 2
  1813.     k=i+j*msgs.0
  1814.     IF k<=count THEN msgs.i=msgs.i msgs.k
  1815.   END
  1816. END
  1817. DROP smsg.
  1818. RETURN
  1819.  
  1820.  
  1821. readmessages:
  1822. searcharg=''
  1823. DO FOREVER
  1824.   SAY 
  1825.   PARSE VAR arg temp' 'arg .
  1826.   IF DATATYPE(temp,'W') THEN msgdir=temp
  1827.   ELSE IF LEFT(UPPER(temp),1)='A' THEN
  1828.     DO
  1829.       CALL newmsgs()
  1830.       arg=''
  1831.       RETURN
  1832.     END
  1833.   ELSE IF LEFT(UPPER(temp),1)='M' THEN
  1834.     DO
  1835.       CALL readmarked()
  1836.       arg=''
  1837.       RETURN
  1838.     END
  1839.   ELSE
  1840.     DO
  1841.       SAY 'Select Message Conference By Number, ['pen3'M'def']arked only or ['pen3'A'def']ll Active'
  1842.       IF areaselect() THEN
  1843.         DO
  1844.           IF LEFT(temp,1)='A' THEN CALL newmsgs()
  1845.           IF LEFT(temp,1)='M' THEN CALL readmarked()
  1846.           RETURN
  1847.         END
  1848.     END
  1849.   pline='['pen3'A'def']rchive ['pen3'S'def']earch ['pen3'T'def']oggle ON/OFF'
  1850.   pline=pline '['pen3'R'def']ead ['pen3'Q'def']uit (aqRst) > '
  1851.   IF arg~='' THEN junk=UPPER(LEFT(arg,1))
  1852.   ELSE junk=getinput(1 1 pline)
  1853.   IF junk='Q' THEN RETURN
  1854.   IF junk='A' THEN
  1855.     DO
  1856.       SAY
  1857.       CALL msgcount(msgdir)
  1858.       junk=getinput(1 0 pen3'RETURN'def' to archive new msgs, ['pen3'Q'def']uit, or enter starting message number > ')
  1859.       IF junk='Q' THEN RETURN
  1860.       IF DATATYPE(junk,'W') THEN
  1861.         DO
  1862.           IF junk>lastmess | junk<1 THEN junk=1
  1863.           lastread.msgdir=junk-1
  1864.           CALL savedata(1)
  1865.         END
  1866.       CALL SETCLIP('BBS_MSGS','ON')
  1867.       SAY 'Archiving messages in the'pen3 msg.msgdir def'Conference...'
  1868.       lastread.msgdir=lastmess
  1869.       ADDRESS AREXX ArcMsgs.rexx name msgdir
  1870.       IF emailonline>=0 THEN emailonline=emailonline+1
  1871.       DO WHILE GETCLIP('BBS_MSGS')~=''
  1872.         CALL DELAY(14)
  1873.       END
  1874.       SAY 'When completed, the archive will be attached to email addressed to you.'
  1875.       CALL savedata(1)
  1876.       SAY
  1877.       RETURN
  1878.     END
  1879.   IF junk='S' THEN
  1880.     DO
  1881.       searcharg=''
  1882.       searcharg=getinput(0 0 pen3'Search Phrase: 'def)
  1883.       IF LENGTH(STRIP(searcharg))=0 THEN RETURN
  1884.       searcharg=COMPRESS(searcharg,'*')
  1885.       SAY
  1886.       CALL searchmsgdir()
  1887.       SAY
  1888.       SAY 'All messages in the'pen3 msg.msgdir def'Conference have been searched.'
  1889.       SAY
  1890.       CALL waiting()
  1891.       searcharg=''
  1892.       RETURN
  1893.     END
  1894.   IF junk='T' THEN
  1895.     DO
  1896.       line='Turning the' msg.msgdir 'conference'
  1897.       IF WORD(data.22,msgdir)<0 THEN
  1898.         DO
  1899.           line=line pen3'ON'def'.'
  1900.           newdata='0'
  1901.         END
  1902.       ELSE
  1903.         DO
  1904.           line=line pen3'OFF'def'.'
  1905.           newdata='-1'
  1906.         END
  1907.       SAY line
  1908.       dataloc=WORDINDEX(data.22,msgdir)-1
  1909.       data.22=DELWORD(data.22,msgdir,1)
  1910.       IF dataloc>0 THEN data.22=INSERT(newdata' ',data.22,dataloc)
  1911.       CALL sortconferences()
  1912.     END
  1913.   CALL readmsg(0)
  1914.   CALL saveData(1)
  1915.   nonstop=0
  1916.   arg=''
  1917. END
  1918. RETURN
  1919.  
  1920.  
  1921. newmsgs:
  1922. test=UPPER(LEFT(arg,1))
  1923. IF test='' THEN
  1924.   test=getinput(1 1 '['pen3'R'def']ead new messages or ['pen3'A'def']rchive for later download. (aR) > ')
  1925. IF test='A' THEN
  1926.   DO
  1927.     CALL SETCLIP('BBS_MSGS','ON')
  1928.     SAY
  1929.     SAY 'Archiving new conference messages...'
  1930.     ADDRESS AREXX ArcMsgs.rexx name
  1931.     IF emailonline>=0 THEN emailonline=emailonline+1
  1932.     clear_marked=1
  1933.     DO i=1 TO level
  1934.       IF WORD(data.22,i)~=-1 THEN
  1935.         lastread.i=countcheck(bbspath'Numbers/LastMessage'i 0)
  1936.     END
  1937.     DO WHILE GETCLIP('BBS_MSGS')~=''
  1938.       CALL DELAY(14)
  1939.     END
  1940.     SAY 'When completed, the archive will be attached to email addressed to you.'
  1941.     CALL savedata(1)
  1942.     SAY
  1943.     RETURN
  1944.   END
  1945. curmsgdir=msgdir
  1946. SAY 'Scanning all Conferences for new messages..'
  1947. DO newi=1 TO level
  1948.   IF msg.newi='' THEN ITERATE newi
  1949.   msgdir=newi
  1950.   CALL readmsg(1)
  1951.   IF msgcom='Q' THEN LEAVE newi
  1952. END
  1953. CALL saveData(1)
  1954. msgdir=curmsgdir
  1955. nonstop=0
  1956. RETURN
  1957.  
  1958.  
  1959. readmsg:
  1960. ARG quietflag marknum .
  1961. msgcom=''
  1962. IF msg.msgdir='' | FIND(data.21,msgdir)>0 THEN RETURN; /* sysop excluded */
  1963. IF WORD(data.22,msgdir)=-1 THEN RETURN;                /*  user excluded */
  1964. entering='Entering'pen3 msg.msgdir def'Message Conference..'
  1965. IF quietflag=0 & marknum='' THEN SAY entering
  1966. IF DATATYPE(WORD(data.22,msgdir),'W') THEN
  1967.   lastread.msgdir=WORD(data.22,msgdir)
  1968. ELSE lastread.msgdir=0
  1969. lstwrt=countcheck(bbspath'Numbers/LastMessage'msgdir 0)
  1970. frstwrt=countcheck(bbspath'Numbers/FirstMessage'msgdir 0)
  1971. temp=''
  1972. IF marknum='' THEN
  1973.   DO
  1974.     IF lastread.msgdir>=lstwrt | lastread.msgdir<frstwrt THEN
  1975.       DO
  1976.         lastread.msgdir=lstwrt
  1977.         CALL msgcount(msgdir)
  1978.         IF quietflag=1 & lastread.msgdir=lstwrt THEN RETURN
  1979.         IF nonstop=1 THEN temp=''
  1980.         ELSE temp=getinput(1 0 pen3'Enter starting message number > 'def)
  1981.         IF temp='' THEN temp=lastread.msgdir
  1982.         IF ~DATATYPE(temp,'W') THEN RETURN
  1983.         IF temp<frstwrt THEN temp=frstwrt
  1984.         IF temp>lstwrt THEN temp=lstwrt
  1985.         IF temp<1 THEN temp=1
  1986.         lastread.msgdir=temp-1
  1987.       END
  1988.   END
  1989. ELSE lastread.msgdir=marknum-1
  1990. IF quietflag=1 THEN SAY entering
  1991. dirname=msgpath||msgdir
  1992. msglist.=0 /* set read to 0, unread to 1, and reply >=2 */
  1993. firstmess=999999
  1994. testlist=SHOWDIR(dirname)
  1995. DO i=1 TO WORDS(testlist)
  1996.   test=WORD(testlist,i)
  1997.   IF test>lastread.msgdir THEN msglist.test=1
  1998.   IF test<firstmess THEN firstmess=test
  1999. END
  2000. IF firstmess=999999 THEN firstmess=0
  2001. CALL countcheck(bbspath'Numbers/FirstMessage'msgdir firstmess)
  2002. msgstatus=1
  2003. IF temp='' & marknum='' THEN CALL msgcount(msgdir)
  2004. skipsubj.=''
  2005. skipsubj.0=0
  2006. DO msgloop=1
  2007.   lastreadnum=lastread.msgdir
  2008.   DO WHILE msglist.lastreadnum=0 & lastreadnum<lstwrt
  2009.     lastreadnum=lastreadnum+1
  2010.   END
  2011.   lastread.msgdir=lastreadnum
  2012.   IF lastreadnum=lstwrt & msglist.lstwrt=0 THEN LEAVE msgloop
  2013.   DO mess=lastread.msgdir TO lstwrt+1
  2014.     IF marknum~='' THEN
  2015.       DO
  2016.         IF mess>marknum THEN LEAVE msgloop
  2017.         mess=marknum
  2018.       END
  2019.     IF msglist.mess~=msgstatus THEN ITERATE mess
  2020.     IF msgstatus>1 THEN SAY 'Following the thread, level' msgstatus-1'.'
  2021.     msglist.mess=0
  2022.     arg=dirname'/'mess
  2023.     IF ~EXISTS(arg) THEN
  2024.       DO
  2025.         SAY 'Message number' mess 'is missing.'
  2026.         ITERATE mess
  2027.       END
  2028.     IF ~readopen(arg) THEN ITERATE mess
  2029.     firstline=READLN(f)
  2030.     secondline=READLN(f)
  2031.     thirdline=READLN(f)
  2032.     forthline=READLN(f)
  2033.     CALL CLOSE(f)
  2034.     CALL killmark(msgdir mess)
  2035.     DO skp=1 TO skipsubj.0
  2036.       IF forthline=skipsubj.skp THEN ITERATE mess
  2037.     END
  2038.     IF WORDS(firstline)>2 THEN /* if replies, change their num to >1 */
  2039.       DO
  2040.         thread=SUBSTR(firstline,WORDINDEX(firstline,4))
  2041.         DO tindx=1 TO WORDS(thread)
  2042.           test=WORD(thread,tindx)
  2043.           IF msglist.test~=0 THEN msglist.test=msgstatus+1
  2044.         END
  2045.       END
  2046.     savearg=arg
  2047.     msgcom='A'
  2048.     DO msgloop2=1 WHILE msgcom='A' | msgcom='O'
  2049.       CALL readlines(arg 1)
  2050.       IF nonstop=1 THEN rnonstop=1
  2051.       ELSE rnonstop=0
  2052.       CALL seelines(2)
  2053.       msgcom=''
  2054.       IF rnonstop THEN
  2055.         DO
  2056.           SAY
  2057.           nonstop=1
  2058.           msgcom=''
  2059.         END
  2060.       ELSE
  2061.         DO
  2062.           pline=''
  2063.           IF level<=sysoplevel | WORDS(lynes.3)<3 THEN pline='['pen3'A'def']gain'
  2064.           IF level>sysoplevel | name=WORD(lynes.2,2) THEN
  2065.             pline=pline '['pen3'E'def']dit ['pen3'K'def']ill'
  2066.           IF level>sysoplevel THEN pline=pline '['pen3'M'def']ove'
  2067.           IF WORDS(lynes.3)>3 THEN pline=pline '['pen3'O'def']riginal'
  2068.           pline=pline '['pen3'N'def']onStop ['pen3'R'def']eply'
  2069.           IF level=99 THEN pline=pline '['pen3'!'def']'
  2070.           pline=pline '['pen3'S'def']kip ['pen3'Q'def']uit ['pen3'?'def']'
  2071.           msgcom=getinput(1 0 STRIP(pline)' > ')
  2072.           CALL cleanline(0)
  2073.         END
  2074.       IF DATATYPE(msgcom,'W') & EXISTS(dirname'/'msgcom) THEN
  2075.         DO
  2076.           arg=dirname'/'msgcom
  2077.           IF msgcom>lastread.msgdir THEN lastread.msgdir=msgcom
  2078.           msgcom='A'
  2079.           ITERATE msgloop2
  2080.         END
  2081.       ELSE msgcom=LEFT(msgcom,1)
  2082.       IF msgcom='Q' THEN LEAVE msgloop
  2083.       ELSE IF msgcom='!' & level>sysoplevel THEN
  2084.         DO
  2085.           CALL DELETE(arg)
  2086.           newchar=LEFT(lynes.1,1)
  2087.           IF newchar~='!' THEN newchar='!!'
  2088.           ELSE newchar='  '
  2089.           lynes.1=OVERLAY(newchar,lynes.1,1,2)
  2090.           CALL savelines(arg)
  2091.           ITERATE msgloop2
  2092.         END
  2093.       ELSE IF msgcom='A' THEN ITERATE msgloop2
  2094.       ELSE IF msgcom='M' & level>sysoplevel THEN
  2095.         DO
  2096.           prevmsgdir=msgdir
  2097.           If ~areaselect() THEN
  2098.             DO
  2099.               himsg=countcheck(bbspath'Numbers/LastMessage'msgdir 0)+1
  2100.               lynes.1='  Msg:' himsg
  2101.               lynes.3='   To:' WORD(lynes.3,2)
  2102.               lynes.5=STRIP(DELWORD(lynes.5,8,1)) msg.msgdir
  2103.               nlyn=lynes.0+1
  2104.               lynes.0=nlyn
  2105.               lynes.nlyn=' *** Moved from the' msg.prevmsgdir 'conference ***'
  2106.               CALL savelines(msgpath||msgdir'/'himsg)
  2107.               CALL countcheck(bbspath'Numbers/LastMessage'msgdir himsg)
  2108.               CALL msgmark(WORD(lynes.3,2) msgdir himsg)
  2109.               CALL readlines(arg 1)
  2110.               CALL DELETE(arg)
  2111.               CALL DELAY(28)
  2112.               lynes.0=7
  2113.               lynes.7='*** Moved to the' msg.msgdir 'conference, message #'himsg' ***'
  2114.               CALL savelines(arg)
  2115.             END
  2116.           msgdir=prevmsgdir
  2117.           msgcom='A'
  2118.         END
  2119.       ELSE IF msgcom='N' THEN
  2120.         DO
  2121.           nonstop=1
  2122.           msgcom=''
  2123.         END
  2124.       ELSE IF msgcom='H' | msgcom='?' THEN
  2125.         DO
  2126.           SAY pen3' - HELP with the Read Messages commands -'def
  2127.           SAY ' RETURN reads the next message in line.'
  2128.           SAY ' 34 will read message number 34, if it exists in this conference.'
  2129.           SAY ' A  reads this message Again (in case it scrolled off screen).'
  2130.           IF level>sysoplevel | name=WORD(lynes.2,2) THEN
  2131.             DO
  2132.           SAY ' E  puts this message into the online Editor.'
  2133.           SAY ' K  deletes a message you wrote. you cannot Kill others!'
  2134.             END
  2135.           IF level>sysoplevel THEN
  2136.           SAY ' M  move this message to a new conference.'
  2137.           SAY ' N  displays all new messages without pausing. CTRL-E to Exit!'
  2138.           SAY ' O  if this message is a reply, will read the Original message.'
  2139.           SAY ' R  enters the message editor to Reply to this message.'
  2140.           SAY ' S  allows you to Skip threads or conferences.'
  2141.         IF level=99 THEN
  2142.           SAY ' !  toggles the do-not-purge! flag for this message.'
  2143.           SAY ' Q  returns to the message menu. (Quit)'
  2144.           SAY
  2145.           CALL waiting()
  2146.           msgcom='A'
  2147.           IF waitchar='Q' THEN LEAVE msgloop
  2148.         END
  2149.       ELSE IF msgcom='E' THEN
  2150.         DO
  2151.           IF level>sysoplevel | name=WORD(lynes.2,2) THEN
  2152.             DO
  2153.               sline=7
  2154.               IF level>sysoplevel THEN sline=1
  2155.               CALL bbsED(sline arg)
  2156.               msgcom='A'
  2157.             END
  2158.         END
  2159.       ELSE IF msgcom='S' & mess<lstwrt THEN
  2160.         DO
  2161.           stemp=''
  2162.           DO WHILE stemp~='T' & stemp~='C'
  2163.             stemp=getinput(1 1 'Skip this ['pen3'T'def']hread or the entire ['pen3'C'def']onference (ct) > ')
  2164.           END
  2165.           IF stemp='T' THEN
  2166.             DO
  2167.               SAY
  2168.               SAY pen3 forthline||def
  2169.               SAY 'Skipping messages with this subject heading...'
  2170.               SAY
  2171.               DO i=lastread.msgdir TO lstwrt
  2172.                 IF msglist.i>1 THEN msglist.i=0
  2173.               END
  2174.               skipsubj.0=skipsubj.0+1
  2175.               sksb=skipsubj.0
  2176.               skipsubj.sksb=forthline
  2177.             END
  2178.           ELSE
  2179.             DO
  2180.               SAY pen3'Skipping to the last message in the'def msg.msgdir pen3'conference.'def
  2181.               lastread.msgdir=lstwrt-1
  2182.               lw=lstwrt-1
  2183.               msglist.lw=0
  2184.               msglist.lstwrt=1
  2185.               LEAVE mess
  2186.             END
  2187.         END
  2188.       ELSE IF msgcom='K' THEN
  2189.         DO
  2190.           IF level>sysoplevel | name=WORD(lynes.2,2) THEN
  2191.             DO
  2192.               IF getinput(1 1 'Really delete' arg'? (Ny) > ')='Y' THEN
  2193.                 DO
  2194.                   IF DELETE(arg)=1 THEN
  2195.                     SAY pen3||arg||def' has been deleted.'
  2196.                   grand=grand-1
  2197.                   msg.msgdir.0=msg.msgdir.0-1
  2198.                 END
  2199.             END
  2200.         END
  2201.       ELSE IF msgcom='O' THEN   /* go back and read original */
  2202.         DO
  2203.           IF WORDS(lynes.3)>3 THEN
  2204.             DO
  2205.               temp=WORD(lynes.3,4)
  2206.               arg=dirname'/'temp
  2207.             END
  2208.           ELSE SAY 'This is the original message.'
  2209.         END
  2210.       ELSE IF msgcom='R' THEN        /*  toname     msgnum  */
  2211.         DO
  2212.           msgnum=WORD(lynes.1,2)
  2213.           forthline=lynes.4
  2214.           IF editor('REPLY' WORD(lynes.2,2) msgnum) THEN /* reply */
  2215.             DO
  2216.               savearg2=arg
  2217.               arg=dirname'/'WORD(lynes.3,4)
  2218.               IF EXISTS(arg) THEN
  2219.                 DO
  2220.                   IF readlines(arg 1) THEN BREAK
  2221.                   xmsg=countcheck(bbspath'Numbers/LastMessage'msgdir mess)
  2222.                   IF WORDS(lynes.1)>3 THEN lynes.1=lynes.1 xmsg
  2223.                   ELSE lynes.1=lynes.1'   Reply' xmsg
  2224.                   CALL DELAY(28)    /* allow 1/2 sec for read to close */
  2225.                   CALL savelines(arg)
  2226.                 END
  2227.               arg=savearg2
  2228.             END
  2229.         END
  2230.       ELSE IF arg~=savearg THEN    /* Continue */
  2231.         DO
  2232.           msgcom='A'
  2233.           arg=savearg
  2234.         END
  2235.     END
  2236.     IF thread~='' THEN
  2237.       DO
  2238.         thread=''
  2239.         msgstatus=msgstatus+1
  2240.       END
  2241.   END
  2242.   IF msgstatus>1 THEN msgstatus=msgstatus-1
  2243. END
  2244. DROP msglist. skipsubj.
  2245. IF quietflag~=1 THEN nonstop=0
  2246. RETURN
  2247.  
  2248.  
  2249. showmarked:
  2250. ARG ff .
  2251. IF WORDS(data.24)<1 THEN RETURN
  2252. fline='These unread conference messages have been ['pen3'M'pen6']arked as addressed to you:'
  2253. IF ff THEN
  2254.   DO
  2255.     SAY
  2256.     SAY pen6||fline||def
  2257.   END
  2258. tempkk=data.24
  2259. DO i=1 TO WORDS(tempkk)
  2260.   tempk=WORD(tempkk,i)
  2261.   PARSE VAR tempk kdir'/'kmsg
  2262.   line=RIGHT(kmsg,6) 'in the'pen3 msg.kdir def'conference'
  2263.   IF EXISTS(msgpath||tempk) THEN
  2264.     DO
  2265.       IF ff THEN SAY line'.'
  2266.       ELSE fline=fline'0A'x||line'.'
  2267.     END
  2268.   ELSE
  2269.     DO
  2270.       line=line 'is missing.'
  2271.       IF ff THEN SAY line
  2272.       ELSE fline=fline'0A'x||line
  2273.       data.24=DELWORD(data.24,FIND(data.24,tempk),1)
  2274.     END
  2275. END
  2276. IF ff THEN
  2277.   DO
  2278.     CALL waiting()
  2279.     SAY
  2280.   END
  2281. ELSE
  2282.   DO
  2283.     IF writeopen(bbspath'EmailFiles/'name'/Marked')=0 THEN RETURN
  2284.     CALL WRITELN(f,fline)
  2285.     CALL CLOSE(f)
  2286.   END
  2287. RETURN
  2288.  
  2289.  
  2290. killmark:
  2291. PARSE ARG kdir kmsg .
  2292. IF data.24='' THEN RETURN
  2293. markword=FIND(data.24,kdir'/'kmsg)
  2294. IF markword>0 THEN data.24=STRIP(DELWORD(data.24,markword,1))
  2295. RETURN
  2296.  
  2297.  
  2298. readmarked:
  2299. mrknum=WORDS(data.24)
  2300. IF mrknum=0 THEN RETURN
  2301. SAY 'Reading only messages addressed to you...'
  2302. mrklist=data.24
  2303. msgcom=''
  2304. DO rmki=1 TO mrknum WHILE msgcom~='Q'
  2305.   tempk=WORD(mrklist,rmki)
  2306.   PARSE VAR tempk mkdir'/'mkmsg .
  2307.   IF ~EXISTS(msgpath||tempk) THEN
  2308.     DO
  2309.       CALL killmark(mkdir mkmsg)
  2310.       SAY
  2311.       SAY 'Message number' mkmsg 'in the' msg.mkdir 'conference is missing!'
  2312.       SAY
  2313.       ITERATE rmki
  2314.     END
  2315.   msgdir=mkdir
  2316.   savelast=lastread.msgdir
  2317.   CALL readmsg(1 mkmsg)
  2318.   IF mkmsg>savelast THEN lastread.msgdir=mkmsg
  2319.   ELSE lastread.msgdir=savelast
  2320. END
  2321. CALL saveData(1)
  2322. RETURN
  2323.  
  2324.  
  2325. sortnumbers:
  2326. PARSE ARG slist
  2327. IF STRIP(slist)='' THEN RETURN ''
  2328. sorted.=''
  2329. oldest=999999
  2330. newest=0
  2331. newlist=''
  2332. DO si=1 TO WORDS(slist)
  2333.   testword=WORD(slist,si)
  2334.   IF ~DATATYPE(testword,'W') THEN
  2335.     DO
  2336.       testpos=LASTPOS('.',testword)
  2337.       IF testpos>0 THEN tempnum=SUBSTR(testword,testpos+1)
  2338.       ELSE
  2339.         DO
  2340.           newlist=testword newlist
  2341.           ITERATE si
  2342.         END
  2343.     END
  2344.   ELSE tempnum=testword/1
  2345.   IF sorted.tempnum='' THEN
  2346.     DO
  2347.       sorted.tempnum=testword
  2348.       sorted.tempnum.0=1
  2349.       IF DATATYPE(tempnum,'W') THEN
  2350.         DO
  2351.           IF tempnum>newest THEN newest=tempnum
  2352.           IF tempnum<oldest THEN oldest=tempnum
  2353.         END
  2354.     END
  2355.   ELSE newlist=newlist testword
  2356. END
  2357. IF oldest~=999999 & newest~=0 THEN
  2358.   DO si=oldest TO newest
  2359.     IF sorted.si.0=1 THEN newlist=newlist sorted.si
  2360.   END
  2361. DROP sorted. oldest newest
  2362. RETURN STRIP(newlist)
  2363.  
  2364.  
  2365. readmail:
  2366. ARG fromenu .
  2367. replysubj=''
  2368. IF fromenu THEN
  2369.   DO
  2370.     temp=UPPER(arg)
  2371.     arg=''
  2372.     IF temp~='F' & temp~='T' & temp~='W' THEN
  2373.       DO
  2374.         line='Find Email ['pen3'F'def']rom You ['pen3'T'def']o You or ['pen3'W'def']rite New Email (ftw) > 'def
  2375.         temp=getinput(1 1 line)
  2376.         CALL cleanline(0)
  2377.       END
  2378.     IF temp='W' THEN
  2379.       DO
  2380.         CALL editor('MAIL')
  2381.         RETURN
  2382.       END
  2383.     ELSE IF temp='F' THEN
  2384.       DO
  2385.         firsteditline=0
  2386.         picklist.=''
  2387.         picklist.0=0
  2388.         IF getinput(1 1 'Check ALL users? (nY) > ')='N' THEN
  2389.           DO
  2390.             picklist.1=getinput(1 0 'Check EMail From' name 'To Who? > ')
  2391.             picklist.1=SPACE(STRIP(UPPER(picklist.1)),1,'_')
  2392.             picklist.1=COMPRESS(picklist.1,'.,:/*#?^ ')
  2393.             IF picklist.1='' THEN RETURN
  2394.             IF FIND(userlist,picklist.1)=0 THEN
  2395.               DO
  2396.                 SAY '***'pen3 picklist.1 def'does not exist!'
  2397.                 picklist.0=0
  2398.                 RETURN
  2399.               END
  2400.             fmaillist=SHOWDIR(bbspath'EMail/'picklist.1)
  2401.             DO ej=1 TO WORDS(fmaillist)
  2402.               ejname=WORD(fmaillist,ej)
  2403.               uname=ejname
  2404.               caret=LASTPOS('.',uname)
  2405.               IF caret>2 THEN uname=LEFT(uname,caret-1)
  2406.               IF uname=name THEN
  2407.                 DO
  2408.                   arg=bbspath'EMail/'picklist.1'/'ejname
  2409.                   IF EXISTS(arg) THEN
  2410.                     DO
  2411.                       pklst=picklist.0+1
  2412.                       picklist.pklst=picklist.1
  2413.                       picklist.pklst.0=ejname
  2414.                       picklist.0=pklst
  2415.                     END
  2416.                 END
  2417.             END
  2418.             IF picklist.0=0 THEN SAY 'No Email FROM you was found.'
  2419.             ELSE
  2420.               DO
  2421.                 SAY pen3'You have the following Email pending:'def
  2422.                 pickcheck=1
  2423.                 DO WHILE pickcheck~=0
  2424.                   pickcheck=pickfromlist()
  2425.                   IF pickcheck~=0 THEN
  2426.                     DO
  2427.                       firsteditline=5
  2428.                       IF level>sysoplevel THEN firsteditline=1
  2429.                       CALL bbsED(firsteditline bbspath'Email/'picklist.pickcheck'/'picklist.pickcheck.0)
  2430.                       IF ~EXISTS(bbspath'Email/'picklist.pickcheck'/'picklist.pickcheck.0) THEN
  2431.                         picklist.pickcheck='- KILLED -'
  2432.                     END
  2433.                 END
  2434.               END
  2435.           END
  2436.         ELSE
  2437.           DO
  2438.             users=WORDS(userlist)
  2439.             SAY pen3'Scanning'def users pen3'email directories...'def||CR
  2440.             SAY pen3' - To ABORT, press CTRL-E -'def||CR
  2441.             DO wi=1 TO users
  2442.               CALL busywait(60 wi users)
  2443.               fmaillist=SHOWDIR(bbspath'EMail/'WORD(userlist,wi))
  2444.               DO ej=1 TO WORDS(fmaillist)
  2445.                 ejname=WORD(fmaillist,ej)
  2446.                 uname=ejname
  2447.                 caret=LASTPOS('.',uname)
  2448.                 IF caret>2 THEN uname=LEFT(uname,caret-1)
  2449.                 IF uname=name THEN
  2450.                   DO
  2451.                     arg=bbspath'EMail/'WORD(userlist,wi)'/'ejname
  2452.                     IF EXISTS(arg) THEN
  2453.                       DO
  2454.                         pklst=picklist.0+1
  2455.                         picklist.pklst=WORD(userlist,wi)
  2456.                         picklist.pklst.0=ejname
  2457.                         picklist.0=pklst
  2458.                       END
  2459.                   END
  2460.               END
  2461.               IF wi=999999 THEN RETURN
  2462.             END
  2463.             CALL busywait(4 0)
  2464.             IF picklist.0=0 THEN SAY lineup'No Email FROM you was found.                    '
  2465.             ELSE
  2466.               DO
  2467.                 SAY pen3'You have Email pending to the following users:'def
  2468.                 pickcheck=1
  2469.                 DO WHILE pickcheck~=0
  2470.                   pickcheck=pickfromlist()
  2471.                   IF pickcheck~=0 THEN
  2472.                     DO
  2473.                       firsteditline=5
  2474.                       IF level>sysoplevel THEN firsteditline=1
  2475.                       CALL bbsED(firsteditline bbspath'Email/'picklist.pickcheck'/'picklist.pickcheck.0)
  2476.                       IF ~EXISTS(bbspath'Email/'picklist.pickcheck'/'picklist.pickcheck.0) THEN
  2477.                         picklist.pickcheck='- KILLED -'
  2478.                     END
  2479.                 END
  2480.               END
  2481.           END
  2482.         DROP picklist.
  2483.         RETURN
  2484.       END
  2485.     ELSE IF temp='T' THEN BREAK
  2486.     ELSE RETURN
  2487.   END
  2488. SAY 'Checking your mailbox..'
  2489. nomail=1
  2490. CALL MAKEDIR(bbspath'EMail/'name)
  2491. mailist=sortnumbers(SHOWDIR(bbspath'Email/'name))
  2492. IF WORDS(mailist)=0 THEN
  2493.   DO
  2494.     SAY lineup'Your mailbox is empty.  '
  2495.     SAY
  2496.     RETURN
  2497.   END
  2498. line=WORDS(mailist)
  2499. IF line>1 THEN line=line 'letters'
  2500. ELSE line=line 'letter'
  2501. line=line 'waiting.'
  2502. SAY line
  2503. DO ii=1 TO WORDS(mailist)
  2504.   SAY 'Email:' pen3||WORD(mailist,ii)||def
  2505. END
  2506. IF ~fromenu THEN
  2507.   IF getinput(1 1 'Read your private mail now? (nY) > ')='N' THEN RETURN
  2508. onename=''
  2509. IF WORDS(mailist)>3 THEN
  2510.   DO
  2511.     IF getinput(1 1 'Read all private mail? (nY) > ')='N' THEN
  2512.       DO
  2513.         onename=getinput(1 0 'Read ONLY private mail from? > ')
  2514.         onename=SPACE(STRIP(UPPER(onename)),1,'_')
  2515.         onename=COMPRESS(onename,'.,:/*#?^ ')
  2516.         IF onename='' THEN RETURN
  2517.         IF FIND(userlist,onename)=0 & picklist.1~='BBBBS' THEN
  2518.           DO
  2519.             SAY '***'pen3 onename def'does not exist!'
  2520.             RETURN
  2521.           END
  2522.       END
  2523.   END
  2524. DO letter=1 TO WORDS(mailist)
  2525.   readname=WORD(mailist,letter)
  2526.   uname=readname
  2527.   caret=LASTPOS('.',uname)
  2528.   IF caret>2 THEN uname=LEFT(uname,caret-1)
  2529.   IF onename~='' & onename~=uname THEN ITERATE letter
  2530.   arg=bbspath'Email/'name'/'readname        /* user has mail! */
  2531.   CALL readlines(arg 1)
  2532.   delnum=WORD(lynes.1,2)
  2533.   CALL seelines(1)
  2534.   nomail=0
  2535.   nonstop=0
  2536.   mailfile=''
  2537.   IF UPPER(WORD(lynes.1,3))='FILE:' THEN mailfile=WORD(lynes.1,4)
  2538.   ELSE IF UPPER(WORD(lynes.2,3))='FILE:' THEN mailfile=WORD(lynes.2,4)
  2539.   IF mailfile~='' & readname~='NEW_FILES' & readname~='FILELISTS_REPORT' & readname~='INACTIVE_USERS' & LEFT(readname,3)~='MSG' THEN
  2540.     DO
  2541.       IF LEFT(RIGHT(mailfile,4),1)~='.' & LEFT(readname,6)='BBBBS.' THEN
  2542.         DO
  2543.           SAY
  2544.           SAY pen3'The attached file is unarchived and may be incomplete.'
  2545.           SAY 'If the archiver is still building this file, downloading will fail.'def
  2546.           IF getinput(1 1 'Do you want to try to download it anyway? (Ny) > ')~='Y' THEN ITERATE letter
  2547.           SAY
  2548.         END
  2549.       curdir=PRAGMA('D')
  2550.       CALL setdir(bbspath'EmailFiles/'name)
  2551.       ADDRESS COMMAND 'C:List >*' mailfile 'DATES'
  2552.       SAY ' Attached file:' pen3||mailfile||def
  2553.       junk=getinput(1 1 'Leave file in your EmailFiles? (Ny) > ')
  2554.       IF junk='Y' THEN mailfile=''
  2555.       ELSE
  2556.         DO
  2557.           junk=getinput(1 1 'Deleting Mail will also delete file. Copy somewhere now? (Ny) > ')
  2558.           IF junk='Y' THEN
  2559.             DO
  2560.               savearg=arg
  2561.               arg=mailfile
  2562.               CALL dload()
  2563.               arg=savearg
  2564.             END
  2565.             CALL setdir(curdir)
  2566.         END
  2567.     END
  2568.   IF readname~='NEW_FILES' & readname~='FILELISTS_REPORT' & readname~='INACTIVE_USERS' & LEFT(readname,3)~='MSG' & LEFT(readname,6)~='BBBBS.' THEN
  2569.     DO
  2570.       tempchar='A'
  2571.       DO WHILE tempchar='A'
  2572.         tempchar=getinput(1 1 '['pen3'A'def']gain  ['pen3'C'def']ontinue  ['pen3'R'def']eply? (acR) > ')
  2573.         IF tempchar='' THEN tempchar='R'
  2574.         IF tempchar='A' THEN CALL seelines(1)
  2575.       END
  2576.       IF tempchar='R' THEN
  2577.         DO
  2578.           IF WORDS(lynes.4)<2 THEN replysubj='NONE'
  2579.           ELSE replysubj=SUBSTR(lynes.4,WORDINDEX(lynes.4,2))
  2580.           CALL editor('MAIL' uname)
  2581.           replysubj=''
  2582.         END
  2583.     END
  2584.   IF LEFT(readname,6)~='BBBBS.' THEN
  2585.     DO
  2586.       tempchar='A'
  2587.       DO WHILE tempchar='A'
  2588.         tempchar=getinput(1 1 'Forward mail from'pen3 uname def'to other users? (aNy) > ')
  2589.         IF tempchar='A' THEN CALL seelines(1)
  2590.       END
  2591.       IF tempchar='Y' THEN
  2592.         DO
  2593.           IF selectchosen(1 pen3'Forward Email To: 'def)=0 THEN
  2594.             DO ei=1 TO thechosen.0 WHILE thechosen.ei~=''
  2595.               CALL MAKEDIR(bbspath'EMail/'thechosen.ei)
  2596.               forwardarg=bbspath'Email/'thechosen.ei'/'readname
  2597.               ADDRESS COMMAND 'C:COPY' bbspath'Email/'name'/'readname forwardarg
  2598.               CALL readlines(forwardarg 1)
  2599.               lynes.1=lynes.1'  Forwarded to you by' name TIME('C') DATE()
  2600.               CALL DELETE(forwardarg)
  2601.               CALL savelines(forwardarg)
  2602.               IF WORDS(lynes.2)>3 THEN
  2603.                 DO
  2604.                   forname=bbspath'EmailFiles/'name'/'WORD(lynes.2,4)
  2605.                   IF EXISTS(forname) THEN
  2606.                     DO
  2607.                       CALL MAKEDIR(bbspath'EmailFiles/'thechosen.ei)
  2608.                       ADDRESS COMMAND 'C:COPY' forname bbspath'EmailFiles/'thechosen.ei
  2609.                     END
  2610.                 END
  2611.               line='Mail' pen3||readname||def 'forwarded to' pen3||thechosen.ei||def
  2612.               IF emailonline>=0 THEN emailonline=emailonline+1
  2613.               SAY line
  2614.             END
  2615.         END
  2616.     END
  2617.   tempchar=''
  2618.   tempstr='Delete the mail ('pen3||delnum||def') from'pen3 uname def'that you just read?'
  2619.   IF mailfile='' THEN tempchar=getinput(1 1 tempstr '(nqY) > ')
  2620.   ELSE
  2621.     DO WHILE tempchar~='N' & tempchar~='Q' & tempchar~='Y'
  2622.       tempchar=getinput(1 1 tempstr '(nqy) > ')
  2623.     END
  2624.   IF tempchar='Q' THEN
  2625.     DO
  2626.       IF getinput(1 1 'Quit reading your Email? (Ny) > ')='Y' THEN
  2627.         DO
  2628.           readname=''
  2629.           uname=''
  2630.           RETURN
  2631.         END
  2632.     END
  2633.   ELSE IF tempchar~='N' THEN
  2634.     DO
  2635.       dirname=bbspath'Email/'name'/'
  2636.       nodelete=0
  2637.       IF bbsprefs.14=1 & name~=sysop & uname~=sysop & WORD(lynes.2,2)~='BBBBS' & WORD(lynes.2,2)~=sysop & WORD(lynes.3,2)~=sysop THEN
  2638.         nodelete=1
  2639.       IF nodelete THEN
  2640.         ADDRESS COMMAND 'C:Copy' dirname||readname bbspath'Email/'sysop
  2641.       ELSE emailonline=emailonline-1
  2642.       CALL DELETE(dirname||readname)
  2643.       tempstr='Old email'
  2644.       IF mailfile~='' & readname~='NEW_FILES' & readname~='FILELISTS_REPORT' & readname~='INACTIVE_USERS' & EXISTS(bbspath'EmailFiles/'name'/'mailfile) THEN
  2645.         DO
  2646.           IF nodelete THEN
  2647.             ADDRESS COMMAND 'C:Copy' bbspath'EmailFiles/'name'/'mailfile bbspath'EmailFiles/'sysop
  2648.           CALL DELETE(bbspath'EmailFiles/'name'/'mailfile)
  2649.           CALL DELETE(bbspath'EmailFiles/'name'/'mailfile'.xdl')
  2650.           tempstr=tempstr 'and attached file'
  2651.         END
  2652.       tempstr=tempstr 'deleted. Thank you for keeping a clean BBS!'
  2653.       SAY tempstr
  2654.       IF tempchar='Q' THEN
  2655.         IF getinput(1 1 'Quit reading your Email? (Ny) > ')='Y' THEN
  2656.           DO
  2657.             readname=''
  2658.             uname=''
  2659.             RETURN
  2660.           END
  2661.     END
  2662.   ELSE IF LEFT(readname,3)='MSG' & level>sysoplevel THEN
  2663.     DO
  2664.       ii=LEFT(readname,POS('.',readname)-1)
  2665.       ii=SUBSTR(ii,4)%1
  2666.       IF getinput(1 1 'Move this message back to the' msg.ii 'conference? (nY) > 'def)~='N' THEN
  2667.         DO
  2668.           temp=TRANSLATE(readname,'/','.')
  2669.           temp=SUBSTR(temp,4)
  2670.           lynes.1='!!'STRIP(lynes.1)
  2671.           edtype=''
  2672.           CALL savelines(msgpath||temp)
  2673.           CALL DELETE(bbspath'Email/'name'/'readname)
  2674.         END
  2675.     END
  2676.   ELSE IF LEFT(readname,3)~='MSG' & readname~='NEW_FILES' & readname~='FILELISTS_REPORT' & readname~='INACTIVE_USERS' THEN
  2677.     DO
  2678.       arg=bbspath'Email/'name'/'readname
  2679.       CALL readlines(arg 1)
  2680.       IF WORDS(lynes.5)<7 THEN
  2681.         DO
  2682.           lynes.5=lynes.5'  (Rcvd)' DATE('W') DATE() TIME('C')
  2683.           CALL DELETE(arg)
  2684.           CALL savelines(arg)
  2685.           SAY 'Email has been marked as received.'
  2686.         END
  2687.     END
  2688.   readname=''
  2689.   uname=''
  2690.   arg=''
  2691. END
  2692. IF nomail THEN
  2693.   DO
  2694.     SAY 'No mail was found.'
  2695.     CALL waiting()
  2696.   END
  2697. CALL setdir(libpath||dirs.1)
  2698. thechosen.=''
  2699. RETURN
  2700.  
  2701.  
  2702. selectchosen:
  2703. PARSE ARG startat selectline
  2704. IF startat<2 THEN thechosen.=''
  2705. line='Enter list of comma separated user names'
  2706. IF level>sysoplevel THEN line=line 'or ALL'
  2707. SAY line
  2708. thechosen.startat=getinput(1 0 selectline' ')
  2709. IF STRIP(thechosen.startat)='' THEN RETURN 1
  2710. thechosen.startat=SPACE(thechosen.startat,1,'_')
  2711. thechosen.0=startat
  2712. IF level>sysoplevel & thechosen.startat='ALL' THEN
  2713.   thechosen.startat=SHOWDIR(bbspath'Users','F',',')
  2714. IF POS(',',thechosen.startat)>0 THEN
  2715.   DO
  2716.     temp=TRANSLATE(thechosen.startat,' ',',')
  2717.     thechosen.0=thechosen.0+WORDS(temp)-1
  2718.     DO ei=1 TO WORDS(temp)
  2719.       eii=startat+ei-1
  2720.       thechosen.eii=STRIP(WORD(temp,ei))
  2721.     END
  2722.   END
  2723. DO ei=startat TO thechosen.0
  2724.   DO WHILE FIND(userlist,thechosen.ei)=0
  2725.     IF thechosen.ei~='' THEN
  2726.       DO
  2727.         IF FIND(exclusion,thechosen.ei)>0 | thechosen.ei='BBBBS' THEN
  2728.           DO
  2729.             thechosen.ei=sysop
  2730.             ITERATE ei
  2731.           END
  2732.         CALL loadcourtesy()
  2733.         IF FIND(courtesy,thechosen.ei)>0 THEN ITERATE ei
  2734.       END
  2735.     SAY thechosen.ei 'not found! Enter that name again or press RETURN.'
  2736.     thechosen.ei=getinput(1 0 pen3||selectline' 'def)
  2737.     IF thechosen.ei='' THEN
  2738.       DO
  2739.         IF getinput(1 1 'Do you want to see the list of current users? (Ny) > ')='Y' THEN
  2740.           CALL showuserlist()
  2741.         ITERATE ei
  2742.       END
  2743.     thechosen.ei=SPACE(thechosen.ei,1,'_')
  2744.   END
  2745. END
  2746. RETURN 0
  2747.  
  2748.  
  2749. countcheck:
  2750. PARSE ARG fname' 'cknum' '.
  2751. IF ~EXISTS(fname) THEN
  2752.   DO
  2753.     IF cknum=0 THEN RETURN 0
  2754.     IF ~writeopen(fname) THEN RETURN 0
  2755.     CALL WRITELN(f,cknum)
  2756.     CALL CLOSE(f)
  2757.     RETURN cknum
  2758.   END
  2759. IF ~readopen(fname) THEN RETURN cknum
  2760. retval=STRIP(READLN(f))
  2761. CALL CLOSE(f)
  2762. IF ~DATATYPE(retval,'W') THEN retval=0
  2763. IF ~DATATYPE(cknum,'W') THEN cknum=0
  2764. IF retval<cknum THEN
  2765.   DO
  2766.     IF writeopen(fname) THEN
  2767.       DO
  2768.         CALL WRITELN(f,cknum)
  2769.         CALL CLOSE(f)
  2770.         RETURN cknum
  2771.       END
  2772.   END
  2773. RETURN retval
  2774.  
  2775.  
  2776. pickfromlist:
  2777. DO pfl=1 TO picklist.0 BY 3
  2778.   pfl2=pfl+1
  2779.   pfl3=pfl+2
  2780.   pfline=pen3||RIGHT(pfl,3)||def LEFT(picklist.pfl,21)
  2781.   IF picklist.pfl2~='' THEN
  2782.     pfline=pfline pen3||RIGHT(pfl2,3)||def LEFT(picklist.pfl2,21)
  2783.   IF picklist.pfl3~='' THEN
  2784.     pfline=pfline pen3||RIGHT(pfl3,3)||def LEFT(picklist.pfl3,21)
  2785.   SAY pfline
  2786. END
  2787. emnum=getinput(1 0 pen3'Select Email Number > 'def)
  2788. IF ~DATATYPE(emnum,'W') | emnum<1 | emnum>picklist.0 THEN RETURN 0
  2789. RETURN emnum
  2790.  
  2791.  
  2792. sysED:
  2793. IF level<99 THEN RETURN
  2794. arg=getinput(0 0 'Textfile To Edit: ')
  2795. IF arg='' THEN RETURN
  2796. CALL bbsED(1 arg)
  2797. RETURN
  2798.  
  2799.  
  2800. bbsED:
  2801. PARSE ARG firstedit editarg .
  2802. notchanged=1
  2803. IF readlines(editarg 1) THEN RETURN 1
  2804. finfo=STATEF(editarg)
  2805. IF WORDS(finfo)>7 THEN finfo=SUBSTR(finfo,WORDINDEX(finfo,8))
  2806. ELSE finfo=''
  2807. SAY 
  2808. SAY '                   'pen3'Entering the EDITOR module..'def
  2809. SAY 
  2810. count=1
  2811. DO edloop=1
  2812.   IF edcom='S' & bbsprefs.5 THEN  /* spell check */
  2813.     DO
  2814.       SAY pen3'You must use ['def'R'pen3']eplace to make corrections.  'pen2'Spellchecking...'def
  2815.       CALL DELETE(scratch'/SpellLOCAL')
  2816.       CALL savelines(scratch'/SpellLOCAL')
  2817.       curdir=PRAGMA('D')
  2818.       CALL setdir(spellpath)
  2819.       CALL SpellChk.rexx(scratch'/SpellLOCAL')
  2820.       CALL setdir(curdir)
  2821.     END
  2822.   ELSE
  2823.     DO
  2824.       IF edcom='R' | edcom='I' | edcom='L' THEN CALL wrapbuf(7)
  2825.       IF edcom~='L' THEN count=count-linesperpage
  2826.       IF count>=lynes.0 | count<1 THEN count=1
  2827.       startcount=count
  2828.       DO i=startcount TO lynes.0+1
  2829.         IF ((i+1-startcount)//linesperpage)=0 THEN
  2830.           DO
  2831.             pline='                 ['pen3'E'def']dit'
  2832.             pline=pline '  ['pen3'RETURN'def']=Continue '
  2833.             edcom=getinput(1 1 pline)
  2834.             IF edcom~='' THEN LEAVE i
  2835.             CALL cleanline(1)
  2836.           END
  2837.         SAY pen3||RIGHT(i,2)||def lynes.i
  2838.         count=count+1
  2839.       END
  2840.     END
  2841.   SAY lineup'     ['pen3'A'def']ppend ['pen3'C'def']ut     ['pen3'I'def']nsert  ['pen3'K'def']ill       ['pen3'?'def'] Help'
  2842.   pline='     ['pen3'L'def']ist   ['pen3'P'def']aste   ['pen3'R'def']eplace'
  2843.   IF bbsprefs.5 THEN pline=pline '['pen3'S'def']pellcheck'
  2844.   pline=pline '['pen3'U'def']pload-Text > '
  2845.   edcom=getinput(1 0 pline)
  2846.   IF edcom='Q' | edcom='X' THEN edcom=''
  2847.   IF edcom='?' THEN
  2848.     DO
  2849.       SAY
  2850.       SAY '                   Editor Help'
  2851.       SAY '----------------------------------------------------------'
  2852.       SAY '    an empty RETURN tells the editor you are done editing.'
  2853.       SAY ' 7  edits line number 7, if it exists.'
  2854.       SAY ' a  Append text to this file.'
  2855.       SAY ' c  Cut selected line(s) of text to buffer.'
  2856.       SAY ' i  Insert blank line.'
  2857.       SAY ' k  Kill (delete) this file.'
  2858.       SAY ' l  List this file from selected line.'
  2859.       SAY ' p  Paste buffer contents to selected line number.'
  2860.       SAY ' r  Replace a phrase or line of text.'
  2861.       SAY ' s  Spellcheck this file.'
  2862.       SAY ' u  Upload a textfile to append to this file.'
  2863.       SAY '----------------------------------------------------------'
  2864.       SAY
  2865.       OPTIONS PROMPT ''
  2866.       PULL
  2867.     END
  2868.   IF edcom='K' THEN
  2869.     DO
  2870.       junk=getinput(1 1 'Are you' pen3'sure'def 'you want to delete' editarg'? (Ny) > ')
  2871.       IF junk='Y' THEN
  2872.         DO
  2873.           IF DELETE(editarg)=1 THEN SAY editarg 'DELETED.'
  2874.           IF WORD(lynes.1,1)='Mail:' & WORDS(lynes.2)>3 THEN
  2875.             DO
  2876.               IF DELETE(bbspath'EmailFiles/'WORD(lynes.3,2)'/'WORD(lynes.2,4))=1 THEN
  2877.                 SAY WORD(lynes.2,4) 'DELETED.'
  2878.             END
  2879.           RETURN 2
  2880.         END
  2881.     END
  2882.   IF edcom='' THEN
  2883.     DO
  2884.       SAY '                   'pen3'Leaving the EDITOR module.'def
  2885.       IF notchanged THEN RETURN 0
  2886.       IF getinput(1 1 '                     Save changes? (nY)'pen3' > 'def)='N' THEN
  2887.         RETURN 1
  2888.       CALL DELETE(editarg)
  2889.       IF savelines(editarg) THEN RETURN 1
  2890.       CALL DELAY(28)
  2891.       IF finfo~='' THEN ADDRESS COMMAND 'C:filenote' editarg finfo
  2892.       SAY pen3'                        Changes saved.'def
  2893.       RETURN 0
  2894.     END
  2895.   ELSE IF edcom='C' THEN  /* Cut */
  2896.     DO
  2897.       firstnum=getinput(1 0 '   Enter line number or range 'pen3'(5-7)'def' to cut' pen3'>'def)
  2898.       IF firstnum='' THEN ITERATE edloop
  2899.       dash=POS('-',firstnum)
  2900.       IF dash>0 THEN
  2901.         DO
  2902.           lastnum=STRIP(SUBSTR(firstnum,dash+1))
  2903.           firstnum=STRIP(LEFT(firstnum,dash-1))
  2904.         END
  2905.       ELSE lastnum=firstnum
  2906.       IF ~DATATYPE(firstnum,'W') | ~DATATYPE(lastnum,'W') THEN
  2907.         DO
  2908.           junk=getinput(1 1 pen3'*** You must enter numbers here! 'def)
  2909.           ITERATE edloop
  2910.         END
  2911.       IF lastnum>lynes.0 THEN lastnum=lynes.0
  2912.       IF firstnum<firstedit THEN
  2913.         DO
  2914.           SAY '*** You are not authorized to delete that line!'
  2915.           SAY
  2916.           ITERATE edloop
  2917.         END
  2918.       IF firstnum>lastnum THEN
  2919.         DO
  2920.           SAY '*** Input error!  First number larger than last number'
  2921.           ITERATE edloop
  2922.         END
  2923.       notchanged=0
  2924.       numdiff=lastnum+1-firstnum
  2925.       pasted.=''
  2926.       pasted.0=numdiff
  2927.       k=0
  2928.       DO i=firstnum TO lynes.0
  2929.         j=i+numdiff
  2930.         k=k+1
  2931.         IF k<=numdiff THEN pasted.k=lynes.i
  2932.         lynes.i=lynes.j
  2933.         lynes.j=''
  2934.       END
  2935.       lynes.0=lynes.0-numdiff
  2936.       count=1
  2937.     END
  2938.   ELSE IF edcom='A' THEN  /* append */
  2939.     DO
  2940.       CALL writebuffer(scratch'/EditorLOCAL')
  2941.       notchanged=0
  2942.     END
  2943.   ELSE IF edcom='U' THEN  /* fileappend (upload) */
  2944.     DO
  2945.       frompath=GETCLIP('BBS_frompath')
  2946.       IF frompath='' THEN frompath=libpath'SysOps'
  2947.       farg=GetFile(150,36,frompath,'',' Select TextFile to Append ')
  2948.       IF farg~='' & EXISTS(farg) THEN
  2949.         DO
  2950.           CALL readlines(farg lynes.0+1)
  2951.           notchanged=0
  2952.           CALL SETCLIP('BBS_frompath',WORD(lastslash(farg),2))
  2953.         END
  2954.     END
  2955.   ELSE IF edcom='I' | edcom='R' | edcom='L' | edcom='P' | DATATYPE(edcom,'W') THEN
  2956.     DO
  2957.       IF DATATYPE(edcom,'W') THEN
  2958.         DO
  2959.           ednum=edcom
  2960.           edcom='R'
  2961.         END
  2962.       ELSE
  2963.         DO
  2964.           line=pen3'   '
  2965.           IF edcom='L' | edcom='P' THEN line=line'Starting '
  2966.           line=line'Line Number? > 'def
  2967.           ednum=getinput(1 0 line)
  2968.         END
  2969.       IF ~DATATYPE(ednum,'W') THEN ITERATE edloop
  2970.       IF ednum>(lynes.0+1) THEN ITERATE edloop
  2971.       IF edcom='L' THEN
  2972.         DO
  2973.           count=ednum
  2974.           ITERATE edloop
  2975.         END
  2976.       IF ednum=1 & UPPER(WORD(lynes.1,1))='FILE:' THEN
  2977.         DO
  2978.           IF getinput(1 1 pen3'Edit KeyWords:? (Ny) > 'def)='Y' THEN
  2979.             DO
  2980.               filenum=STRIP(WORD(lynes.1,2))
  2981.               num=files.filenum.0
  2982.               keywords=edkeywords(editarg)
  2983.               lynes.1=LEFT(lynes.1,21) keywords
  2984.               alpha.num=TRIM(OVERLAY(keywords,alpha.num,47,32))
  2985.               savefileflag=1
  2986.               notchanged=0
  2987.               ITERATE edloop
  2988.             END
  2989.         END
  2990.       IF ednum<firstedit THEN
  2991.         DO
  2992.           SAY '*** You are not authorized to alter that line!'
  2993.           SAY
  2994.           ITERATE edloop
  2995.         END
  2996.       IF edcom='R' THEN   /* replace */
  2997.         DO
  2998.           SAY '   Now reads:'
  2999.           SAY pen3||RIGHT(ednum,2)||def lynes.ednum
  3000.           OPTIONS PROMPT pen3'........Search text? >'def
  3001.           PARSE PULL stext
  3002.           IF LENGTH(stext)=0 THEN
  3003.             DO
  3004.               IF getinput(1 1 lineup||pen3'Replace entire line? (nY) >'def)='N' THEN
  3005.                 ITERATE edloop
  3006.               lynes.ednum=getinput(0 0 pen3||RIGHT(ednum,2)' 'def)
  3007.               notchanged=0
  3008.               ITERATE edloop
  3009.             END
  3010.           found=POS(UPPER(stext),UPPER(lynes.ednum))
  3011.           IF found=0 THEN
  3012.             DO
  3013.               SAY
  3014.               SAY stext' was not found!'
  3015.               SAY
  3016.               ITERATE edloop
  3017.             END
  3018.           OPTIONS PROMPT pen3'...Replacement text? >'def
  3019.           PARSE PULL rtext
  3020.           lynes.ednum=DELSTR(lynes.ednum,found,LENGTH(stext))
  3021.           lynes.ednum=INSERT(rtext,lynes.ednum,found-1)
  3022.           IF ednum<4 & LEFT(lynes.1,6)='File: ' THEN
  3023.             DO
  3024.               PARSE VAR lynes.1 'File: 'filenum . 'KeyWords: 'keywords
  3025.               PARSE VAR lynes.3 . 'Lib:' libnam
  3026.               filenum=STRIP(filenum)
  3027.               newc=files.filenum.0
  3028.               libnum=finddirnum(libnam)
  3029.               alpha.newc=LEFT(WORD(lynes.2,2),22-LENGTH(WORD(lynes.2,4)))
  3030.               alpha.newc=alpha.newc WORD(lynes.2,4) RIGHT(filenum,5)
  3031.               alpha.newc=alpha.newc RIGHT(libnum,2) LEFT(STRIP(libnam),12)
  3032.               alpha.newc=alpha.newc STRIP(LEFT(STRIP(keywords),32))
  3033.               savefileflag=1
  3034.             END
  3035.           SAY 'Done.'
  3036.           SAY 
  3037.           notchanged=0
  3038.         END
  3039.       ELSE IF edcom='I' THEN  /* insert */
  3040.         DO
  3041.           DO i=lynes.0 TO ednum BY -1
  3042.             j=i+1
  3043.             lynes.j=lynes.i
  3044.           END
  3045.           lynes.ednum=''
  3046.           notchanged=0
  3047.           lynes.0=lynes.0+1
  3048.           lynes.ednum=getinput(0 0 pen3||RIGHT(ednum,2)'>'def)
  3049.         END
  3050.       ELSE IF edcom='P' THEN   /* paste */
  3051.         DO
  3052.           DO i=lynes.0 TO ednum BY -1
  3053.             j=i+pasted.0
  3054.             lynes.j=lynes.i
  3055.           END
  3056.           DO k=1 TO pasted.0
  3057.             kk=ednum+k-1
  3058.             lynes.kk=pasted.k
  3059.           END
  3060.           notchanged=0
  3061.           lynes.0=lynes.0+pasted.0
  3062.         END
  3063.     END
  3064. END
  3065. RETURN 0
  3066.  
  3067.  
  3068. editor:
  3069. toname=''
  3070. msgnum=0
  3071. thechosen.=''
  3072. PARSE ARG edtype toname msgnum .
  3073. IF edtype='MAIL' THEN lastwrit=countcheck(bbspath'Numbers/LastMail 0')
  3074. ELSE 
  3075.   DO
  3076.     IF edtype='MSG' THEN
  3077.       DO
  3078.         tempmsgdir=0
  3079.         IF DATATYPE(arg,'W') THEN tempmsgdir=arg
  3080.         IF tempmsgdir>0 & tempmsgdir<=level & msg.tempmsgdir~='' THEN
  3081.           msgdir=tempmsgdir
  3082.         ELSE IF areaselect() THEN RETURN
  3083.       END
  3084.     lastwrit=countcheck(bbspath'Numbers/LastMessage'msgdir 0)
  3085.   END
  3086. IF toname='' THEN
  3087.   DO
  3088.     IF edtype='MAIL' THEN
  3089.       DO
  3090.         CALL selectchosen(1 pen3'Send PRIVATE' edtype lastwrit+1 'To: 'def)
  3091.         toname=thechosen.1
  3092.       END
  3093.     ELSE toname=getinput(1 0 pen3'Post A PUBLIC Message To: 'def)
  3094.   END
  3095. toname=SPACE(STRIP(UPPER(toname)),1,'_')
  3096. toname=COMPRESS(toname,'.,:/*#?^ ')
  3097. IF toname='' | FIND(exclusion,toname)>0 THEN
  3098.   DO
  3099.     IF toname='' & edtype='MSG' THEN toname='ALL'
  3100.     ELSE toname=sysop
  3101.     SAY pen3'*** Re-Addressed to'def toname
  3102.   END
  3103. IF toname~='ALL' THEN
  3104.   DO
  3105.     IF toname='BBBBS' THEN toname=sysop
  3106.     IF FIND(userlist,toname)=0 THEN
  3107.       DO
  3108.         IF courtesy='' THEN CALL loadcourtesy()
  3109.         IF FIND(courtesy,toname)=0 THEN
  3110.           DO
  3111.             SAY
  3112.             SAY bak2' 'toname' is not on the user list! 'def
  3113.             IF edtype='MAIL' THEN
  3114.               DO
  3115.                 CALL showuserlist()
  3116.                 RETURN 0
  3117.               END
  3118.             ELSE
  3119.               DO
  3120.                 IF getinput(1 1 'Do you want to use it anyway? (nY) > ')='N' THEN
  3121.                   DO
  3122.                     IF getinput(1 1 'Do you want to see the list of current users? (Ny) > ')='Y' THEN
  3123.                       CALL showuserlist()
  3124.                     RETURN 0
  3125.                   END
  3126.               END
  3127.           END
  3128.       END
  3129.   END
  3130. IF edtype='MAIL' THEN
  3131.   DO
  3132.     CALL MAKEDIR(bbspath'EMail/'toname)
  3133.     mailname=bbspath'EMail/'toname'/'name'.'lastwrit+1
  3134.   END
  3135. ELSE
  3136.   DO
  3137.     CALL MAKEDIR(msgpath||msgdir)
  3138.     mailname=msgpath||msgdir'/'lastwrit+1
  3139.   END
  3140. lynes.=''
  3141. lynes.0=6
  3142. IF edtype='MAIL' THEN lynes.1=' Mail:' lastwrit+1  /* FILE: filename */
  3143. ELSE lynes.1='  Msg:' lastwrit+1          /* Msg: MSG# REPLY # # ... */
  3144. lynes.2=' From:' name
  3145. IF city~='' THEN lynes.2=lynes.2' - 'city
  3146. lynes.3='   To:' toname                       /*  To: toname   MSG # */
  3147. IF edtype='MAIL' THEN
  3148.   DO
  3149.     IF readopen(bbspath||'Users/'toname) THEN
  3150.       DO
  3151.         CALL READLN(f)
  3152.         CALL READLN(f)
  3153.         temp=READLN(f)
  3154.         CALL CLOSE(f)
  3155.         temp=docity(temp)
  3156.         IF temp~='' THEN lynes.3=lynes.3' - 'temp
  3157.       END
  3158.     IF replysubj='|@NEW@|' THEN
  3159.       DO
  3160.         CALL readlines(bbspath'BBS_TEXT/EMAIL_WELCOME' 7)
  3161.         replysubj='Welcome to' bbsname
  3162.       END
  3163.   END
  3164. subj=''
  3165. IF edtype='REPLY' THEN
  3166.   DO
  3167.     subj=SUBSTR(forthline,WORDINDEX(forthline,2))
  3168.     SAY pen3'Subj:'def subj
  3169.     temp=getinput(0 0 'Change the current subject? (Ny) > ')
  3170.     IF LENGTH(temp)>3 THEN subj=temp
  3171.     ELSE IF LEFT(UPPER(temp),1)='Y' THEN subj=''
  3172.   END
  3173. ELSE IF edtype='MAIL' & replysubj~='' THEN subj=replysubj
  3174. IF subj='' THEN
  3175.   DO
  3176.     IF opt='C' THEN subj='FEEDBACK'
  3177.     ELSE
  3178.       DO
  3179.         SAY pen3'Enter the'def 'Subject' pen3'of this message (1 line).'def
  3180.         subj=getinput(0 0 pen3': 'def)
  3181.       END
  3182.   END
  3183. IF LENGTH(subj)>66 THEN subj=LEFT(subj,66)
  3184. IF subj='' THEN subj='?'
  3185. lynes.4=' Subj:' subj
  3186. lynes.5=' Date:' DATE('W') DATE()'  'TIME('C')
  3187. IF edtype~='MAIL' THEN lynes.5=LEFT(lynes.5,39) 'Conference:' msg.msgdir
  3188. lynes.6=LEFT('',74,'=')
  3189. IF edtype='REPLY' THEN lynes.3=lynes.3'  MSG 'msgnum
  3190. DO i=1 TO lynes.0
  3191.   SAY lynes.i
  3192. END
  3193. CALL writebuffer(scratch'/MessageLOCAL')
  3194. IF savelines(mailname) THEN RETURN 0
  3195. CALL seelines(1)
  3196. IF thechosen.0='' THEN
  3197.   DO
  3198.     thechosen.0=1
  3199.     thechosen.1=toname
  3200.   END
  3201. carbons=thechosen.0+1
  3202. DO FOREVER
  3203.   IF thechosen.0>=carbons THEN
  3204.     DO
  3205.       junk='Copies To:'
  3206.       DO cci=carbons TO thechosen.0
  3207.         junk=junk thechosen.cci
  3208.       END
  3209.       SAY junk
  3210.     END
  3211.   pline=''
  3212.   IF edtype='MAIL' THEN pline='['pen3'C'def']opies'
  3213.   pline=STRIP(pline '['pen3'E'def']dit ['pen3'K'def']ill ['pen3'R'def']ead')
  3214.   pline=pline '['pen3'U'def']pload-Text ['pen3'S'def']end' edtype'? (ekrSu) 'def
  3215.   junk=getinput(1 1 pline)
  3216.   IF junk='E' THEN
  3217.     DO
  3218.       IF level>sysoplevel THEN firstedit=1
  3219.       ELSE firstedit=7
  3220.       IF bbsED(firstedit mailname)=2 THEN RETURN 0
  3221.       junk='R'
  3222.     END
  3223.   ELSE IF edtype='MAIL' & junk='C' THEN
  3224.     DO
  3225.       CALL selectchosen(carbons pen3'Carbon Copies To: 'def)
  3226.       junk='R'
  3227.     END
  3228.   ELSE IF junk='K' THEN
  3229.     DO
  3230.       IF DELETE(mailname)=1 THEN SAY edtype 'DELETED.'
  3231.       RETURN 0
  3232.     END
  3233.   ELSE IF junk='U' THEN
  3234.     DO
  3235.       SAY 'Ready to append' pen3'TEXT ONLY'def
  3236.       pline='Are you SURE your file is un-compressed text? (Ny) > '
  3237.       IF getinput(1 1 pline)='Y' THEN
  3238.         DO
  3239.           arg='UploadLOCAL'
  3240.           curdir=PRAGMA('D')
  3241.           CALL setdir(scratch)
  3242.           CALL DELETE(arg)
  3243.           CALL DELETE('tempLOCAL')
  3244.           IF uload(0)=0 THEN
  3245.             DO
  3246.               ADDRESS COMMAND 'C:copy' mailname 'tempLOCAL'
  3247.               CALL DELETE(mailname)
  3248.               ADDRESS COMMAND 'C:join tempLOCAL UploadLOCAL AS' mailname
  3249.             END
  3250.           CALL setdir(curdir)
  3251.         END
  3252.       junk='R'
  3253.     END
  3254.   IF junk='R' THEN
  3255.     DO
  3256.       CALL readlines(mailname 1)
  3257.       CALL seelines(1)
  3258.       nonstop=0
  3259.     END
  3260.   ELSE BREAK
  3261. END
  3262. IF edtype='MAIL' THEN
  3263.   DO
  3264.     IF replysubj~='' & readname~='' & LEFT(readname,5)~='BBBBS' & uname~='' & uname~='UNAME' THEN
  3265.       DO
  3266.         junk=getinput(1 1 'Attach original mail from' uname'? (nY) > ')
  3267.         IF junk~='N' THEN
  3268.           DO
  3269.             arg=bbspath'Email/'name'/'readname
  3270.             IF ~readlines(arg 1) THEN CALL savelines(mailname)
  3271.           END
  3272.       END
  3273.     junk=getinput(1 1 pen3'Attach a file to this message? (Ny) > 'def)
  3274.     IF junk='Y' THEN
  3275.       DO
  3276.         savearg=arg
  3277.         arg=''
  3278.         curdir=PRAGMA('D')
  3279.         CALL MAKEDIR(bbspath'EmailFiles/'toname)
  3280.         CALL setdir(bbspath'EmailFiles/'toname)
  3281.         IF uload(0)=0 THEN
  3282.           DO
  3283.             IF WORD(STATEF(bbspath'EmailFiles/'toname'/'arg),2)>1 THEN
  3284.               DO
  3285.                 CALL readlines(mailname 1)
  3286.                 IF arg~='' THEN lynes.1=lynes.1'  FILE: 'arg
  3287.                 CALL setdir(curdir)
  3288.                 CALL DELETE(mailname)
  3289.                 CALL savelines(mailname)
  3290.               END
  3291.           END
  3292.         ELSE
  3293.           DO
  3294.             CALL DELETE(bbspath'EmailFiles/'toname'/'arg)
  3295.             SAY pen3'*** Upload failed! ***'def
  3296.           END
  3297.         arg=savearg
  3298.       END
  3299.     totmail=WORD(data.17,2)
  3300.     IF ~DATATYPE(totmail,'W') THEN totmail=1
  3301.     ELSE totmail=totmail+1
  3302.     data.17=WORD(data.17,1)'  'totmail'  'WORD(data.17,3)
  3303.   END
  3304. IF edtype~='MAIL' THEN totwrit.msgdir=totwrit.msgdir+1
  3305. CALL readlines(mailname 1)
  3306. DO ui=1 TO thechosen.0
  3307.   IF thechosen.ui='' THEN ITERATE ui
  3308.   IF ui>1 THEN
  3309.     DO
  3310.       CALL MAKEDIR(bbspath'Email/'thechosen.ui)
  3311.       newname=bbspath'Email/'thechosen.ui'/'name'.'lastwrit+1
  3312.       IF ui<carbons THEN lynes.3='   To:' thechosen.ui
  3313.       ELSE
  3314.         DO
  3315.           lynes.1=lynes.1'  (Carbon Copy)'
  3316.           lynes.3='   To:' thechosen.1
  3317.         END
  3318.       CALL savelines(newname)
  3319.       IF WORDS(lynes.1)>3 & EXISTS(bbspath'EmailFiles/'thechosen.1'/'WORD(lynes.1,4)) THEN
  3320.         DO
  3321.           CALL MAKEDIR(bbspath'EmailFiles/'thechosen.ui)
  3322.           ADDRESS COMMAND 'C:COPY' bbspath'EmailFiles/'thechosen.1'/'WORD(lynes.1,4) bbspath'EmailFiles/'thechosen.ui
  3323.           line2='Copied' WORD(lynes.1,4)
  3324.           SAY line2 'to the' thechosen.ui 'file area.'
  3325.         END
  3326.     END
  3327.   IF edtype~='MAIL' THEN
  3328.     DO
  3329.       IF FIND(userlist,thechosen.ui)>0 THEN
  3330.         CALL msgmark(thechosen.ui msgdir lastwrit+1)
  3331.     END
  3332.   IF GETCLIP('BBS_level')~='' & WORD(GETCLIP('BBS_lastcaller'),1)=thechosen.ui THEN
  3333.     DO
  3334.       temp='new Email.'
  3335.       IF edtype~='MAIL' THEN
  3336.         temp='a new message addressed to you in the'pen3 msg.msgdir def'conference.'
  3337.       oldmess=GETCLIP('BBS_MESSAGE')
  3338.       IF oldmess~='' THEN oldmess=oldmess||'0D0A'x
  3339.       CALL SETCLIP('BBS_MESSAGE',oldmess||'You have' temp)
  3340.     END
  3341.   line=edtype 'Sent To' thechosen.ui
  3342.   IF edtype='MAIL' THEN
  3343.     DO
  3344.       IF emailonline>=0 THEN emailonline=emailonline+1
  3345.     END
  3346.   ELSE
  3347.     DO
  3348.       grand=grand+1
  3349.       IF ~DATATYPE(msg.msgdir.0,'W') THEN msg.msgdir.0=1
  3350.       ELSE msg.msgdir.0=msg.msgdir.0+1
  3351.       line=line 'in the'pen3 msg.msgdir def'conference.'
  3352.     END
  3353.   SAY line
  3354. END
  3355. IF edtype='MAIL' THEN CALL countcheck(bbspath'Numbers/LastMail' lastwrit+1)
  3356. ELSE CALL countcheck(bbspath'Numbers/LastMessage'msgdir lastwrit+1)
  3357. CALL setdir(libpath||dirs.1)
  3358. thechosen.=''
  3359. RETURN 1
  3360.  
  3361.  
  3362. msgmark:
  3363. PARSE ARG markname markdir markmsg .
  3364. IF OPEN(f,bbspath'Users/'markname,'R')=0 THEN RETURN
  3365. mlines.=''
  3366. DO mi=1
  3367.   temp=READLN(f)
  3368.   IF EOF(f) THEN LEAVE mi
  3369.   mlines.mi=STRIP(temp)
  3370. END
  3371. CALL CLOSE(f)
  3372. mlines.0=mi-1
  3373. CALL DELAY(28)
  3374. mlines.24=STRIP(mlines.24 markdir'/'markmsg)
  3375. IF OPEN(f,bbspath'Users/'markname,'W')=0 THEN RETURN
  3376. DO mi=1 TO mlines.0
  3377.   CALL WRITELN(f,mlines.mi)
  3378. END
  3379. CALL CLOSE(f)
  3380. RETURN
  3381.  
  3382.  
  3383. shell:
  3384. SAY
  3385. olddir=PRAGMA('D')
  3386. DO WHILE(UPPER(opt)~='EXIT')
  3387.   SAY bak2||TIME('C')||def PRAGMA('D')
  3388.   OPTIONS PROMPT pen3'Type EXIT to quit AmigaDOS> 'def
  3389.   PARSE PULL opt' 'arg
  3390.   IF(UPPER(opt)='CD') THEN CALL setdir(arg)
  3391.   ELSE IF exists(opt)~=0 THEN
  3392.     DO
  3393.       IF LEFT(STATEF(opt),3)='DIR' THEN CALL setdir(opt)
  3394.     END
  3395.   ELSE IF opt~='' & UPPER(opt)~='EXIT' THEN
  3396.     ADDRESS COMMAND opt '<* >*' arg
  3397. END
  3398. CALL PRAGMA('D',olddir)
  3399. RETURN
  3400.  
  3401.  
  3402. bbsspace:
  3403. ARG tabspace .
  3404. ADDRESS COMMAND 'C:info >ram:locinfout' bbsdevice
  3405. ok=OPEN(f,'ram:locinfout','R')
  3406. IF ok=0 THEN RETURN 20
  3407. line=READLN(f)
  3408. line=READLN(f)
  3409. line=READLN(f)
  3410. line=READLN(f)
  3411. CALL CLOSE(f)
  3412. IF tabspace<14 THEN SAY 
  3413. bbsk=WORD(line,4)
  3414. IF ~DATATYPE(bbsk,'N') THEN
  3415.   DO
  3416.     line=bbsdevice 'is not an info compatible device!'
  3417.     SAY pen3||line||def
  3418.     bbsk=0
  3419.     RETURN
  3420.   END
  3421. bbsk=bbsk*512-SYSTEM_SPACE_LIMIT
  3422. IF bbsk<1 THEN bbsk=0
  3423. SAY RIGHT(comma(bbsk),tabspace) 'bytes available for uploads.'
  3424. RETURN
  3425.  
  3426.  
  3427. comma:
  3428. ARG num .
  3429. dgt=LENGTH(num)
  3430. numtext=''
  3431. IF dgt>3 THEN numtext=','RIGHT(num,3)
  3432. IF dgt>6 THEN numtext=','LEFT(RIGHT(num,6),3)||numtext
  3433. IF dgt>9 THEN numtext=','LEFT(RIGHT(num,9),3)||numtext
  3434. IF dgt>12 THEN
  3435.   DO
  3436.     numtext=','LEFT(RIGHT(num,12),3)||numtext
  3437.     numtext=LEFT(num,dgt-12)||numtext
  3438.   END
  3439. ELSE IF dgt>9 THEN numtext=LEFT(num,dgt-9)||numtext
  3440. ELSE IF dgt>6 THEN numtext=LEFT(num,dgt-6)||numtext
  3441. ELSE IF dgt>3 THEN numtext=LEFT(num,dgt-3)||numtext
  3442. ELSE numtext=num
  3443. RETURN numtext
  3444.  
  3445.  
  3446. is_here:
  3447. ARG newname 
  3448. SAY 'Checking filelist...'
  3449. DO wi=1 TO 99
  3450.   IF wi//3=0 THEN CALL WRITECH(STDOUT,'.')
  3451.   IF dirs.wi='' THEN ITERATE wi
  3452.   IF ~EXISTS(bbspath'FileNotes/'dirs.wi'/'newname) THEN ITERATE wi
  3453.   line=pen3'*** File' newname 'already exists here'
  3454.   IF wi<=level THEN line=line 'in the' dirs.wi 'directory'
  3455.   line=line'.'def
  3456.   SAY line
  3457.   SAY 'Original uploader should ['pen3'K'def']ill the file before uploading the replacement.'
  3458.   CALL waiting()
  3459.   RETURN 1
  3460. END
  3461. CALL cleanline(1)
  3462. RETURN 0
  3463.  
  3464.  
  3465. uload:
  3466. ARG frommenu
  3467. CALL bbsspace(12)
  3468. SAY
  3469. IF bbsk<1 THEN
  3470.   DO
  3471.     SAY pen3'Upload area is full!'def
  3472.     RETURN 1
  3473.   END
  3474. IF arg='' THEN
  3475.   DO
  3476.     frompath=GETCLIP('BBS_frompath')
  3477.     IF frompath='' THEN frompath=libpath'SysOps'
  3478.     fdir=''
  3479.     fromfile=GetFile(150,36,frompath,'',' Select File to Upload ')
  3480.     IF fromfile='' THEN RETURN 1
  3481.     x=LASTPOS('/',fromfile)
  3482.     IF x=0 THEN x=POS(':',fromfile)
  3483.     IF x>0 THEN
  3484.       DO
  3485.         arg=SUBSTR(fromfile,x+1)
  3486.         fdir=LEFT(fromfile,x)
  3487.         IF RIGHT(fdir,1)='/' THEN fdir=LEFT(fdir,x-1)
  3488.         CALL SETCLIP('BBS_frompath',fdir)
  3489.       END
  3490.     ELSE arg=fromfile
  3491.   END
  3492. ELSE fromfile=PRAGMA('D')'/'arg
  3493. arg=COMPRESS(arg,' :/,;|#?*()+[]"{}')  /* be sure no illegals here */
  3494. x=LASTPOS('/',arg)
  3495. IF x=0 THEN x=LASTPOS(':',arg)
  3496. IF x>0 THEN
  3497.   DO
  3498.     IF DATATYPE(SUBSTR(arg,x+1),'W') THEN
  3499.       DO
  3500.         SAY 'Whole numbers are not allowed as filenames!'
  3501.         CALL waiting()
  3502.         RETURN 1
  3503.       END
  3504.   END
  3505. tempnum=LENGTH(arg)-16
  3506. DO WHILE tempnum>0 & POS('EMAILFILES',UPPER(PRAGMA('D')))=0
  3507.   temp='          'pen3||arg def'is'pen3 tempnum||def
  3508.   IF tempnum=1 THEN temp=temp 'character'
  3509.   ELSE temp=temp 'characters'
  3510.   temp=temp 'too long for a filename.'
  3511.   SAY temp  
  3512.   arg=getinput(0 0 'Filename: ')
  3513.   arg=cleanstring('0:'arg)
  3514.   arg=COMPRESS(arg,' :/,;|#?*')
  3515.   tempnum=LENGTH(arg)-16
  3516. END
  3517. IF arg='' THEN RETURN 1
  3518. IF frommenu THEN
  3519.   DO
  3520.     IF is_here(arg) THEN RETURN 1
  3521.     IF bbsprefs.6=1 & sysoplevel>level THEN CALL setdir(libpath'Sysops')
  3522.     ELSE
  3523.       DO
  3524.         SAY 'Please select an appropriate library for -' pen3||arg def'-'
  3525.         IF chdir()>0 THEN RETURN
  3526.       END
  3527.   END
  3528. ADDRESS COMMAND 'C:COPY' fromfile PRAGMA('D')'/'arg
  3529. IF TestArc.rexx(PRAGMA('D')'/'arg)>0 THEN
  3530.   DO
  3531.     SAY
  3532.     SAY pen3'***'def arg pen3'failed archive check!'def
  3533.     SAY
  3534.     temp=getinput(1 1 'Do you believe the archive checker made a mistake? (Ny) > ')
  3535.     IF temp~='Y' THEN
  3536.       DO
  3537.         CALL DELETE(arg)
  3538.         SAY
  3539.         RETURN 2
  3540.       END
  3541.   END
  3542. IF POS('EMAILFILES',UPPER(PRAGMA('D')))>0 THEN RETURN 0
  3543. DO ui=sysoplevel+2 TO 100
  3544.   IF UPPER(dirs.ui)=UPPER(plaindir) THEN RETURN 0
  3545. END
  3546. IF frommenu THEN
  3547.   DO WHILE editnote(bbspath'FileNotes/'plaindir'/'arg) /* INSIST on a filenote */
  3548.   END
  3549. RETURN 0
  3550.  
  3551.  
  3552. findfiles:
  3553. PARSE ARG ffile .
  3554. IF POS('EMAILFILES',UPPER(PRAGMA('D')))>0 THEN RETURN ffile
  3555. wi=0
  3556. IF DATATYPE(ffile,'W') THEN
  3557.   DO
  3558.     IF WORDS(files.ffile)<2 THEN RETURN 0
  3559.     dirtemp=WORD(files.ffile,1)
  3560.     IF finddirnum(dirtemp)>level | FIND(data.21,UPPER(dirtemp))>0 THEN
  3561.       DO
  3562.         CALL illegal_access()
  3563.         RETURN 0
  3564.       END
  3565.     CALL setdir(libpath||dirtemp)
  3566.   END
  3567. ELSE IF EXISTS(ffile) THEN
  3568.   DO
  3569.     IF EXISTS(bbspath'FileNotes/'plaindir'/'ffile) THEN
  3570.       DO
  3571.         IF readopen(bbspath'FileNotes/'plaindir'/'ffile)~=0 THEN
  3572.           DO
  3573.             line=READLN(f)
  3574.             CALL CLOSE(f)
  3575.             ffile=WORD(line,2)
  3576.           END
  3577.       END
  3578.   END
  3579. ELSE IF EXISTS(bbspath'Information'ffile) THEN
  3580.   RETURN bbspath'Information/'ffile
  3581. ELSE
  3582.   DO
  3583.     nextfilenum=countcheck(bbspath'Numbers/LastFile' 0)+1
  3584.     CALL busywait(4 1)
  3585.     DO ni=nextfilenum TO 0 BY -1
  3586.       IF ni<1 THEN
  3587.         DO
  3588.           CALL busywait(4 0)
  3589.           SAY '***' files.0 'filenames scanned,'pen3 ffile def'was not found!'
  3590.           RETURN 0
  3591.         END
  3592.       IF ni>1 THEN CALL busywait(60 ni nextfilenum)
  3593.       argtemp=WORD(files.ni,2)
  3594.       IF UPPER(argtemp)=UPPER(ffile) THEN
  3595.         DO
  3596.           dirtemp=WORD(files.ni,1)
  3597.           jj=files.ni.0
  3598.           IF WORD(alpha.jj,4)>level | FIND(data.21,UPPER(dirtemp))>0 THEN
  3599.             DO
  3600.               CALL busywait(4 0)
  3601.               CALL illegal_access()
  3602.               RETURN 0
  3603.             END
  3604.           ffile=ni
  3605.           CALL setdir(libpath||dirtemp)
  3606.           LEAVE ni
  3607.         END
  3608.     END
  3609.     CALL busywait(4 0)
  3610.   END
  3611. ftemp=ffile
  3612. IF DATATYPE(ftemp,'W') THEN ftemp=WORD(files.ftemp,2)
  3613. IF ~EXISTS(ftemp) THEN
  3614.   DO
  3615.     finfo=STATEF(bbspath'FileNotes/'plaindir'/'ftemp)
  3616.     IF WORDS(finfo)>7 THEN ftemp=WORD(finfo,8)
  3617.     IF ~EXISTS(ftemp) THEN
  3618.       DO
  3619.         IF finfo='' THEN SAY '***'pen3 PRAGMA('D')'/'ftemp def'was not found!'
  3620.         ELSE
  3621.           DO
  3622.             SAY
  3623.             SAY '***'pen3 plaindir'/'ftemp def'is not currently available online.'
  3624.             SAY 'Please leave email to your sysop'pen3 sysop||def', to receive this file.'
  3625.             SAY
  3626.           END
  3627.         RETURN 0
  3628.       END
  3629.   END
  3630. RETURN ffile
  3631.  
  3632.  
  3633. illegal_access:
  3634. SAY
  3635. SAY '*** You are not authorized to access' ffile'!'
  3636. SAY '*** Send Email to' sysop 'to receive a higher level.'
  3637. SAY
  3638. RETURN
  3639.  
  3640.  
  3641. ext_dload:
  3642. SAY
  3643. arg=bbsExtDL.baud(name level TRUNC(maxtime-TIME('E')) linesperpage colorflag extdevs)
  3644. IF arg~='' THEN SAY 'Sorry, LOCAL mode cannot download from the Extra Devices.'
  3645. RETURN
  3646.  
  3647.  
  3648. dload:
  3649. arg=STRIP(arg data.25)
  3650. data.25=''
  3651. errorflag=0
  3652. curdir=PRAGMA('D')
  3653. OPTIONS PROMPT 'Filename and/or number: '
  3654. IF arg='' THEN PARSE PULL arg  /* no filename given */
  3655. IF arg='' THEN RETURN 0
  3656. IF findfiles(arg)=0 THEN RETURN 0
  3657. arg=TRANSLATE(arg,'  ',':/')
  3658. IF WORDS(arg)>1 THEN arg=WORD(arg,1)
  3659. IF DATATYPE(arg,'W') THEN
  3660.   DO
  3661.     CALL setdir(libpath||WORD(files.arg,1))
  3662.     arg=WORD(files.arg,2)
  3663.   END
  3664. IF arg~='' THEN           /* check for filename */
  3665.   DO dloadloop=1
  3666.     frompath=GETCLIP('BBS_frompath')
  3667.     IF frompath='' THEN frompath=libpath'SysOps/'
  3668.     notename=bbspath'FileNotes/'plaindir'/'arg
  3669.     IF ~EXISTS(arg) THEN
  3670.       DO
  3671.         finfo=STATEF(notename)
  3672.         IF WORDS(finfo)>7 THEN
  3673.           DO
  3674.             temp=plaindir
  3675.             x=lastslash(WORD(finfo,8))
  3676.             arg=WORD(x,1)
  3677.             CALL setdir(WORD(x,2))
  3678.             plaindir=temp
  3679.           END
  3680.       END
  3681.     topath=PRAGMA('D')
  3682.     num=LASTPOS('/',arg)
  3683.     IF num=0 THEN num=LASTPOS(':',arg)
  3684.     IF num>0 THEN
  3685.       DO
  3686.         topath=LEFT(arg,num)
  3687.         arg=SUBSTR(arg,num+1)
  3688.       END
  3689.     IF RIGHT(topath,1)~=':' & RIGHT(topath,1)~='/' THEN topath=topath'/'
  3690.     SAY ' Select Filename to Copy ' topath||arg 'To:'
  3691.     tofile=GetFile(150,36,frompath,arg,' Select Destination Name ')
  3692.     IF tofile='' THEN
  3693.       DO
  3694.         errorflag=1
  3695.         LEAVE dloadloop
  3696.       END
  3697.     ADDRESS COMMAND 'C:Copy' topath||arg tofile
  3698.     CALL SETCLIP('BBS_frompath',WORD(lastslash(tofile),2))
  3699.     IF POS('EMAILFILES',UPPER(PRAGMA('D')))>0 THEN LEAVE dloadloop
  3700.     DO di=sysoplevel+2 TO 100
  3701.       IF UPPER(dirs.di)=UPPER(plaindir) THEN LEAVE dloadloop
  3702.     END
  3703.     IF readlines(notename 1) THEN LEAVE dloadloop
  3704.     dls=WORD(lynes.2,7)
  3705.     IF ~DATATYPE(dls,'W') THEN dls=0
  3706.     lynes.2=STRIP(DELWORD(lynes.2,7,1)) dls+1
  3707.     finfo=STATEF(notename)
  3708.     IF WORDS(finfo)>7 THEN finfo=SUBSTR(finfo,WORDINDEX(finfo,8))
  3709.     ELSE finfo=''
  3710.     CALL DELETE(notename)
  3711.     CALL savelines(notename)
  3712.     CALL DELAY(28)
  3713.     IF finfo~='' THEN ADDRESS COMMAND 'C:FileNote' notename finfo
  3714.     LEAVE dloadloop
  3715.   END
  3716. CALL setdir(curdir)
  3717. IF errorflag THEN SAY pen3'*** Download Failed!'def
  3718. RETURN errorflag
  3719.  
  3720.  
  3721. lastslash:
  3722. PARSE ARG sarg 
  3723. sdir=''
  3724. slash=LASTPOS('/',sarg)
  3725. IF slash>2 THEN sdir=LEFT(sarg,slash-1)
  3726. ELSE
  3727.   DO
  3728.     slash=LASTPOS(':',sarg)
  3729.     IF slash>0 THEN sdir=LEFT(sarg,slash)
  3730.   END
  3731. IF slash>0 THEN sarg=SUBSTR(sarg,slash+1)
  3732. RETURN sarg sdir
  3733.  
  3734.  
  3735. editnote:
  3736. IF arg='' THEN
  3737.   DO
  3738.     PARSE PULL arg .
  3739.     IF arg='' THEN RETURN 0
  3740.   END
  3741. comment=''
  3742. IF ~EXISTS(arg) THEN
  3743.   DO
  3744.     finfo=STATEF(bbspath'FileNotes/'plaindir'/'arg)
  3745.     fromarg=arg
  3746.     fromdir=GETCLIP('BBS_frompath')
  3747.     IF WORDS(finfo)>7 THEN
  3748.       DO
  3749.         temp='Y'
  3750.         fromdir=WORD(finfo,8)
  3751.         fromdir=lastslash(fromdir)
  3752.         fromarg=WORD(fromdir,1)
  3753.         fromdir=WORD(fromdir,2)
  3754.       END
  3755.     ELSE
  3756.       DO
  3757.         IF level<sysoplevel THEN RETURN 0
  3758.         temp=getinput(1 1 'Is this file on an another device? (Nqy)')
  3759.       END
  3760.     IF fromdir='' THEN fromdir=libpath'Sysops'
  3761.     IF temp='Y' THEN
  3762.       DO WHILE comment=''
  3763.         comment=GetFile(150,36,fromdir,fromarg,' Select Linked File ')
  3764.         IF comment='' THEN RETURN 0
  3765.         IF ~EXISTS(comment) THEN comment=''
  3766.         ELSE CALL SETCLIP('BBS_frompath',WORD(lastslash(comment),2))
  3767.       END
  3768.     ELSE IF temp~='N' THEN RETURN 0
  3769.   END
  3770. IF comment='' THEN
  3771.   DO
  3772.     arg=findfiles(arg)
  3773.     IF arg=0 THEN RETURN 0
  3774.     IF DATATYPE(arg,'W') THEN arg=WORD(files.arg,2)
  3775.   END
  3776. filedir=plaindir
  3777. slash=LASTPOS('/',arg)
  3778. IF slash=0 THEN slash=LASTPOS(':',arg)
  3779. IF slash>0 THEN
  3780.   DO
  3781.     filedir=LEFT(arg,slash-1)
  3782.     filedir=SUBSTR(filedir,5)
  3783.     arg=SUBSTR(arg,slash+1)
  3784.   END
  3785. ELSE filedir=plaindir
  3786. CALL MAKEDIR(bbspath'FileNotes/'filedir)
  3787. IF ~EXISTS(bbspath'FileNotes/'filedir) THEN
  3788.   DO
  3789.     SAY pen3'*** Failed to open directory!' filedir||def
  3790.     RETURN 0
  3791.   END
  3792. notename=bbspath'FileNotes/'filedir'/'arg
  3793. lynes.=''
  3794. filenum=countcheck(bbspath'Numbers/LastFile' 0)
  3795. IF level>sysoplevel THEN firstedit=1
  3796. ELSE firstedit=5
  3797. IF EXISTS(notename) THEN
  3798.   DO
  3799.     IF comment~='' THEN ADDRESS COMMAND 'C:filenote' notename comment
  3800.     CALL bbsED(firstedit notename)
  3801.     RETURN 0
  3802.   END
  3803. IF comment='' THEN filedata=STATEF(libpath||filedir'/'arg)
  3804. ELSE filedata=STATEF(comment)
  3805. IF filedata='' THEN
  3806.   DO
  3807.     IF comment='' THEN line=filedir'/'arg
  3808.     ELSE line=comment
  3809.     SAY line 'does not exist!'
  3810.     RETURN 0
  3811.   END
  3812. bytes=WORD(filedata,2)
  3813. filenum=filenum+1
  3814. lynes.0=4
  3815. lynes.1='File: 'LEFT(filenum,5)' KeyWords:'
  3816. lynes.2='Name: 'LEFT(arg,27)' Size: 'bytes' bytes   Downloads: 0'
  3817. lynes.3='From: 'LEFT(name,27)' Date: 'DATE() TIME('C')'  Lib: 'filedir
  3818. lynes.4=LEFT('',74,'=')
  3819. lynes.1=lynes.1 edkeywords(arg filedir)
  3820. CALL seelines(1)
  3821. edtype=''
  3822. CALL writebuffer(scratch'/NoteLOCAL')
  3823. IF savelines(notename) THEN RETURN 0
  3824. IF comment~='' THEN ADDRESS COMMAND 'C:filenote' notename comment
  3825. fncom='R'
  3826. DO WHILE fncom='R'
  3827.   CALL seelines(1)
  3828.   nonstop=0
  3829.   line='['pen3'E'def']dit'
  3830.   IF level>sysoplevel THEN line=line '['pen3'K'def']ill'
  3831.   line=line '['pen3'R'def']ead ['pen3'S'def']ave'
  3832.   IF level>sysoplevel THEN line=line '(ekrS) 'def
  3833.   ELSE line=line '(erS) 'def
  3834.   fncom=getinput(1 1 line)
  3835.   IF fncom='K' & level>sysoplevel THEN
  3836.     DO
  3837.       SAY 'Killing FileNote..'
  3838.       CALL DELETE(notename)
  3839.       RETURN 1
  3840.     END
  3841.   ELSE IF fncom='E' THEN
  3842.     DO
  3843.       IF bbsED(firstedit notename)>0 THEN RETURN 0
  3844.       fncom='R'
  3845.     END
  3846.   ELSE IF fncom~='R' THEN
  3847.     DO
  3848.       SAY 'Adjusting filelist...'
  3849.       IF filenum<1 THEN filenum=1
  3850.       IF GETCLIP('BBS_level')~='' THEN CALL SETCLIP('BBS_localfiles',1)
  3851.       CALL countcheck(bbspath'Numbers/LastFile' filenum)
  3852.       files.0=files.0+1
  3853.       newcount=alpha.0+1
  3854.       alpha.0=newcount
  3855.       files.filenum=plaindir arg
  3856.       files.filenum.0=newcount
  3857.       libnum=finddirnum(plaindir)
  3858.       PARSE VAR lynes.1 . 'KeyWords:' keywords
  3859.       alpha.newcount=LEFT(arg,22-LENGTH(WORD(lynes.2,4)))
  3860.       alpha.newcount=alpha.newcount WORD(lynes.2,4) RIGHT(filenum,5)
  3861.       alpha.newcount=alpha.newcount RIGHT(libnum,2) LEFT(plaindir,12)
  3862.       alpha.newcount=alpha.newcount STRIP(LEFT(STRIP(keywords),32))
  3863.       IF EXISTS(bbspath'Lists/Files') THEN
  3864.         x=OPEN(f,bbspath'Lists/Files','A')
  3865.       ELSE x=OPEN(f,bbspath'Lists/Files','W')
  3866.       IF x=0 THEN
  3867.         DO
  3868.           SAY '*** Failed to open' bbspath'Lists/Files'
  3869.           RETURN 0
  3870.         END
  3871.       CALL WRITELN(f,filenum files.filenum)
  3872.       CALL CLOSE(f)
  3873.       IF EXISTS(bbspath'Lists/Files.ALPHA') THEN
  3874.         x=OPEN(f,bbspath'Lists/Files.ALPHA','A')
  3875.       ELSE x=OPEN(f,bbspath'Lists/Files.ALPHA','W')
  3876.       IF x=0 THEN
  3877.         DO
  3878.           SAY '*** Failed to open' bbspath'Lists/Files.ALPHA'
  3879.           RETURN 0
  3880.         END
  3881.       CALL WRITELN(f,alpha.newcount)
  3882.       CALL CLOSE(f)
  3883.       sortalphaflag=1
  3884.       savefileflag=1
  3885.     END
  3886. END
  3887. RETURN 0
  3888.  
  3889.  
  3890. edkeywords:
  3891. PARSE ARG kwarg
  3892. templine=''
  3893. DO WHILE LENGTH(templine)<3
  3894.   SAY
  3895.   SAY pen3'Please enter a list of keywords (or a condensed description)'def
  3896.   SAY pen3'to be used in the alphabetic list and by the search routine.'def
  3897.   SAY '    Note that only the first 32 characters will be used.'
  3898.   SAY LEFT('',43)'|'LEFT('',31,'=')'|'
  3899.   templine=getinput(0 0 ' 'RIGHT(STRIP(RIGHT(kwarg,32)),32) pen3'KeyWords: 'def)
  3900.   templine=cleanstring('0:'templine)
  3901.   templine=STRIP(LEFT(templine,32))
  3902.   SAY
  3903. END
  3904. RETURN templine
  3905.  
  3906.  
  3907. loadfiles:
  3908. SAY def
  3909. SAY 'Loading filelist...'
  3910. files.=''
  3911. files.0=0
  3912. IF readopen(bbspath'Lists/Files') THEN
  3913.   DO
  3914.     DO i=1
  3915.       line=READLN(f)
  3916.       IF EOF(f) THEN BREAK
  3917.       num=WORD(line,1)
  3918.       IF DATATYPE(num,'W') THEN files.num=WORD(line,2) WORD(line,3)
  3919.     END
  3920.     files.0=i-1
  3921.     CALL CLOSE(f)
  3922.   END
  3923. RETURN
  3924.  
  3925.  
  3926. savefilelist:
  3927. IF level=99 THEN
  3928.   IF getinput(1 1 'Update filelists now? (nY) > ')='N' THEN RETURN
  3929.  
  3930. savefilelist2:
  3931. SIGNAL OFF BREAK_E
  3932. IF ckmaint('FILES') THEN RETURN
  3933. CALL savealphalist()
  3934. SAY 'Saving filelist...'
  3935. CALL SETCLIP('BBS_maint',1)
  3936. xarg=bbspath'Lists/Files'
  3937. CALL DELETE(xarg)
  3938. filenum=countcheck(bbspath'Numbers/LastFile' 0)
  3939. IF filenum<1 | writeopen(xarg)=0 THEN RETURN
  3940. DO i=1 TO filenum
  3941.   IF files.i='' THEN ITERATE
  3942.   CALL WRITELN(f,i files.i)
  3943. END
  3944. CALL CLOSE(f)
  3945. CALL SETCLIP('BBS_maint')
  3946. savefileflag=0
  3947. IF SHOW('P','BBBBS') THEN CALL SETCLIP('BBS_localfiles',2)
  3948. RETURN
  3949.  
  3950.  
  3951. loadalpha:
  3952. SAY def
  3953. SAY 'Loading the alphabetical filelist...'
  3954. IF readopen(bbspath'Lists/Files.ALPHA') THEN
  3955.   DO
  3956.     alpha.=''
  3957.     alpha.0=0
  3958.     DO i=1
  3959.       line=READLN(f)
  3960.       IF EOF(f) THEN BREAK
  3961.       fnum=WORD(line,3)
  3962.       IF DATATYPE(fnum,'W') THEN
  3963.         DO
  3964.           alpha.i=line
  3965.           files.fnum.0=i
  3966.         END
  3967.       ELSE i=i-1
  3968.     END
  3969.     CALL CLOSE(f)
  3970.     alpha.0=i-1
  3971.     IF alpha.0<files.0 THEN buildalpha=1
  3972.   END
  3973. ELSE SAY pen3'*** Lists/Files.ALPHA failed to open for reading!'def
  3974. SAY
  3975. RETURN
  3976.  
  3977.  
  3978. ckmaint:
  3979. ARG ckfile .
  3980. IF GETCLIP('BBS_maint')~='' THEN
  3981.   DO
  3982.     DO i=0 TO 23 WHILE GETCLIP('BBS_maint')~=''
  3983.       IF i//2=0 THEN SAY 'Waiting' (24-i)*5 'more seconds for' ckfile 'list update to finish...'
  3984.       CALL DELAY(250)
  3985.     END
  3986.     IF i>23 THEN
  3987.       DO
  3988.         SAY '*** unable to update' ckfile 'list.'
  3989.         RETURN 1
  3990.       END
  3991.   END
  3992. RETURN 0
  3993.  
  3994.  
  3995. savealphalist:
  3996. SIGNAL OFF BREAK_E
  3997. IF ckmaint('ALPHA') THEN RETURN
  3998. CALL SETCLIP('BBS_maint',1)
  3999. IF GETCLIP('BBS_mainfiles')~='' & GETCLIP('BBS_maint')='' THEN
  4000.   DO
  4001.     CALL SETCLIP('BBS_mainfiles')
  4002.     CALL loadfiles()
  4003.     CALL loadalpha()
  4004.   END
  4005. aarg=bbspath'Lists/Files.ALPHA'
  4006. CALL DELETE(aarg)
  4007. IF sortalphaflag=1 THEN
  4008.   DO
  4009.     SAY 'Alphabetizing' alpha.0 'files...'
  4010.     CALL QSORT(1,alpha.0,alpha)
  4011.     DO i=1 TO alpha.0
  4012.       fnum=WORD(alpha.i,3)
  4013.       files.fnum.0=i
  4014.     END
  4015.   END
  4016. sortalphaflag=0
  4017. IF writeopen(aarg)=0 THEN
  4018.   DO
  4019.     SAY '*** Error opening' aarg '!'
  4020.     CALL SETCLIP('BBS_maint')
  4021.     RETURN
  4022.   END
  4023. SAY 'Saving alphabetical filelist...'
  4024. DO i=1 TO alpha.0
  4025.   ii=WORD(alpha.i,3)
  4026.   IF files.ii='' THEN alpha.i='0 0' ii '100'
  4027.   IF LEFT(alpha.i,4)~='0 0 ' THEN CALL WRITELN(f,alpha.i)
  4028. END
  4029. CALL CLOSE(f)
  4030. CALL SETCLIP('BBS_maint')
  4031. CALL bbsALPHA.rexx SUBSTR(extension,2) arccom
  4032. RETURN
  4033.  
  4034.  
  4035. viewuser:
  4036. SAY 
  4037. SAY bak2' 'name' 'def
  4038. DO i=1 TO 18
  4039.   stuff=data.i
  4040.   IF i=13 | i=14 THEN stuff=DATE(,data.i,'S')
  4041.   SAY RIGHT(i,2)||pen3 text.i||def':' stuff
  4042. END
  4043. CALL waiting()
  4044. RETURN
  4045.  
  4046.  
  4047. edituser:
  4048. IF getinput(1 1 'Change ['pen3'U'def']ser data or ['pen3'M'def']essage conference access (mU) > ')='M' THEN
  4049.   DO
  4050.     SAY
  4051.     SAY pen3'     - Message Conference Access -'def
  4052.     SAY '[O]ff turns all message conferences OFF.'
  4053.     SAY 'Set the last message read by you in ALL message conferences'
  4054.     temp=getinput(1 1 ' ['pen3'L'def']ast  ['pen3'F'def']irst  ['pen3'O'def']ff  ['pen3'Q'def']uit  (fLoq) > ')
  4055.     IF temp='Q' THEN RETURN
  4056.     SAY 'Resetting...'lineup
  4057.     data.22=''
  4058.     DO i=1 TO level
  4059.       IF temp='F' THEN num=0
  4060.       ELSE IF temp='O' THEN num=-1
  4061.       ELSE num=countcheck(bbspath'Numbers/LastMessage'i 0)
  4062.       data.22=data.22 num
  4063.     END
  4064.     CALL SetData()
  4065.     CALL sortconferences()
  4066.     CALL savedata(1)
  4067.     RETURN
  4068.   END
  4069. new=0
  4070. change=0
  4071. edata.=''
  4072. edname=name
  4073. DO i=0 TO data.0
  4074.   edata.i=data.i
  4075. END
  4076. num=1
  4077. DO WHILE num~='' | edname~=name
  4078.   IF num='' | LEFT(num,1)='Q' THEN
  4079.     DO
  4080.       IF change THEN
  4081.         DO
  4082.           CALL SetData()
  4083.           CALL saveData(1)
  4084.           change=0
  4085.         END
  4086.       IF new THEN
  4087.         DO
  4088.           data.=''
  4089.           DO i=0 TO edata.0
  4090.             data.i=edata.i
  4091.           END
  4092.           name=edname
  4093.           new=0
  4094.         END
  4095.       CALL SetData()
  4096.     END
  4097.   maxnum=10
  4098.   IF edata.20>sysoplevel THEN maxnum=20
  4099.   IF edata.20=99 THEN maxnum=24
  4100.   SAY bak2' 'name' 'def
  4101.   maxlines=21
  4102.   IF maxnum=10 THEN maxlines=20
  4103.   DO i=1 TO maxlines
  4104.     IF i=5 & name~=edname & edata.20<99 THEN ITERATE
  4105.     SAY RIGHT(i,2)||pen3 text.i||def':' data.i
  4106.   END
  4107.   IF edata.20>sysoplevel THEN
  4108.     DO
  4109.       line=LEFT(' ',50)
  4110.       IF name=edname THEN line=line'NEW = Change User.'
  4111.       line=pen3||line||def||lineup
  4112.       SAY line
  4113.     END
  4114.   num=getinput(1 0 'Select Line Number To Edit: ')
  4115.   IF num='NEW' & edata.20>sysoplevel & edname=name THEN    /* select a new user */
  4116.     DO
  4117.       new=1
  4118.       IF change THEN
  4119.         DO
  4120.           CALL SetData()
  4121.           CALL saveData(1)
  4122.         END
  4123.       change=0
  4124.       nufile=bbspath'Lists/NEW_USERS'
  4125.       IF EXISTS(nufile) THEN
  4126.         IF ~readlines(nufile 1) THEN CALL seelines(0)
  4127.       savename=name
  4128.       name=getinput(1 0 'New User Name: 'def)
  4129.       name=SPACE(name,1,'_')
  4130.       name=COMPRESS(name,':/*#?^')
  4131.       IF loadData()=0 THEN name=savename
  4132.       IF data.20>=edata.20 THEN
  4133.         DO
  4134.           SAY 'Can''t Edit!' pen3||name def'has an equal or higher level than thee.'
  4135.           name=savename
  4136.           CALL loadData()
  4137.         END
  4138.     END
  4139.   ELSE IF DATATYPE(num,'W') & num>0 THEN
  4140.     DO
  4141.       IF num>maxnum THEN
  4142.         DO
  4143.           SAY 
  4144.           SAY pen3'You are not authorized to change that information!'def
  4145.           SAY 
  4146.         END
  4147.       ELSE
  4148.         DO dummy=1 TO 1
  4149.           IF num=8 THEN
  4150.             DO
  4151.               SAY
  4152.               SAY 'Use spaces to seperate options.'
  4153.               SAY 'If the option word is in line 8, it is ON.'
  4154.               SAY 'Valid Options:'
  4155.               SAY '        MENU   combines all main commands into 1 menu.'
  4156.               SAY '        MENUS  splits main commands into 3 menus.'
  4157.               SAY '        COLOR  turns ANSI color codes ON.'
  4158.               SAY '        PHONE  makes your phone number public.'
  4159.               SAY '        QUICK  for long distance callers. See BBBBS.REVISION'
  4160.               SAY '        STREET makes your street address public.'
  4161.               SAY '        TERSE  skips some of the logon procedures.'
  4162.               SAY
  4163.             END
  4164.           line=RIGHT(num,2)||pen3 text.num||def': '
  4165.           SAY line||data.num
  4166.           temp=getinput(0 0 line)
  4167.           IF temp='' THEN
  4168.             DO
  4169.               IF num=1 | num=4 | num=5 | num=6 | num=7 THEN LEAVE dummy
  4170.               IF num=11 | num=12 | num=13 | num=20 THEN LEAVE dummy
  4171.             END
  4172.           IF num=5 | num=8 THEN temp=UPPER(temp)
  4173.           IF num=20 & DATATYPE(temp,'W') & temp>=edata.20 THEN
  4174.             temp=data.20
  4175.           IF edata.20>sysoplevel & name~=edname THEN line2=name' '
  4176.           ELSE line2=''
  4177.           IF num=21 & name=edname & edata.20<99 THEN LEAVE dummy
  4178.           line=text.num':' data.num pen6'CHANGED TO'def temp
  4179.           data.num=temp
  4180.           SAY line
  4181.           SAY 
  4182.           change=1
  4183.         END
  4184.     END
  4185. END
  4186. IF change THEN
  4187.   DO
  4188.     CALL SetData()
  4189.     CALL saveData(1)
  4190.   END
  4191. RETURN
  4192.  
  4193.  
  4194. getnumber:
  4195. PARSE ARG tprompt
  4196. tnum=getinput(1 0 '  'tprompt' > ')
  4197. mask=COMPRESS(XRANGE(),'0123456789')
  4198. tnum=COMPRESS(tnum,mask)
  4199. IF ~DATATYPE(tnum,'W') THEN tnum=0
  4200. tnum=tnum%1
  4201. IF tnum>0 & tnum<10 THEN tnum='0'tnum
  4202. RETURN tnum
  4203.  
  4204.  
  4205. getbirth:
  4206. data.12=WORD(data.12,1)'  'WORD(data.12,2)'  Birthday:'
  4207. SAY pen3'Please enter your birthday.'def
  4208. month=getnumber('month: (1-12)')
  4209. day=getnumber('  day: (1-31)')
  4210. year=getnumber(' year:       ')
  4211. IF year<100 THEN year=year+1900
  4212. born=year||month||day
  4213. IF born<18750101 | born>(DATE('S')-50000) THEN
  4214.   DO
  4215.     born=''
  4216.     IF getinput(1 1 'Would you rather skip this question? (Ny) > ')~='Y' THEN
  4217.       CALL getbirth()
  4218.   END
  4219. data.12=WORD(data.12,1)'  'WORD(data.12,2)'  'WORD(data.12,3)' 'WORD(born,1)
  4220. RETURN
  4221.  
  4222.  
  4223. getname:
  4224. CALL showuserlist()
  4225. SAY
  4226. pline='Please enter your full Email name : '
  4227. name=getinput(1 0 pline)
  4228. IF name='' THEN
  4229.   DO
  4230.     SAY 'No name, no entry.  Bye!'
  4231.     SIGNAL DONE
  4232.   END
  4233. name=cleanstring(1':'name)
  4234. name=COMPRESS(name,':/*#?^')
  4235. IF FIND(userlist,name)>0 | FIND(exclusion,name)>0 THEN
  4236.   DO
  4237.     SAY 'Sorry! That name is taken. Please try again.'
  4238.     RETURN 1
  4239.   END
  4240. RETURN 0
  4241.  
  4242.  
  4243. /** see if name is in data */
  4244.  
  4245. checkUser:
  4246. tries=0
  4247. IF name='NEW' THEN
  4248.   DO
  4249.     name=''
  4250.     DO WHILE getname()
  4251.     END
  4252.   END
  4253. IF FIND(userlist,name)=0 THEN
  4254.   DO
  4255.     IF EXISTS(bbspath'BBS_TEXT/NEW') THEN
  4256.       DO
  4257.         nonstop=0
  4258.         CALL readlines(bbspath'BBS_TEXT/NEW' 1)
  4259.         CALL seelines(0)
  4260.         CALL waiting()
  4261.       END
  4262.     SAY
  4263.     defile=bbspath'BBS_TEXT/DEF.NEW_USER'
  4264.     CALL loadcourtesy()
  4265.     wordnum=FIND(courtesy,name)
  4266.     IF wordnum>0 THEN
  4267.       DO
  4268.         SAY name', is on the Courtesy List. You will be granted immediate access.'
  4269.         courtesy=STRIP(DELWORD(courtesy,wordnum,1))
  4270.         IF writeopen(bbspath'Lists/Courtesy') THEN
  4271.           DO
  4272.             DO i=1 TO WORDS(courtesy)
  4273.               CALL WRITELN(f,WORD(courtesy,i))
  4274.             END
  4275.             CALL CLOSE(f)
  4276.           END
  4277.         defile=bbspath'BBS_TEXT/DEF.COURTESY'
  4278.       END
  4279.     ELSE IF bbsprefs.7=0 THEN SAY name', You have new user access.'
  4280.     IF readlines(defile 1) THEN SIGNAL DONE
  4281.     data.=''
  4282.     data.0=24
  4283.     DO i=6 TO 22
  4284.       data.i=lynes.i
  4285.     END
  4286.     data.12=DATE('S')'  'TIME('C')
  4287.     data.13=data.12
  4288.     lastondate=DATE('I')-1
  4289.     lastontime=TIME('C')
  4290.     SAY 'Please enter the password you would like to use here.'
  4291.     data.5=getinput(1 0 'Password: ')
  4292.     IF data.5='' THEN
  4293.       DO
  4294.         line=''name 'refused to enter a password.'
  4295.         SIGNAL DONE
  4296.       END
  4297.     data.1=''
  4298.     DO WHILE data.1=''
  4299.       data.1=getinput(0 0 'Full Name: ')
  4300.       IF data.1='' THEN SAY 'You MUST leave your real name!'
  4301.     END
  4302.     data.2=getinput(0 0 'Street: ')
  4303.     data.3=getinput(0 0 'City, State Zip: ')
  4304.     data.4=''
  4305.     DO WHILE data.4=''
  4306.       data.4=getinput(0 0 'Phone: ')
  4307.       IF data.4='' THEN
  4308.         SAY sysop 'MUST be able to reach you by phone to validate you!'
  4309.     END
  4310.     CALL getbirth()
  4311.     IF bbsprefs.8 THEN
  4312.       DO
  4313.         newufile=bbspath'Lists/NEW_USERS'
  4314.         IF EXISTS(newufile) THEN ok=OPEN(f,newufile,'A')
  4315.         ELSE
  4316.           DO
  4317.             ok=OPEN(f,newufile,'W')
  4318.             IF ok~=0 THEN CALL WRITELN(f,'*** New Users ***')
  4319.           END
  4320.         IF ok~=0 THEN
  4321.           DO
  4322.             temp=RIGHT(TIME('C'),7) COMPRESS(DATE())
  4323.             temp=temp LEFT(name,24)'=' data.1 data.4
  4324.             CALL WRITELN(f,temp) 
  4325.           END
  4326.         CALL CLOSE(f)
  4327.       END
  4328.     data.9=getinput(0 0 'Computer: ')
  4329.     data.10=getinput(0 0 'Interests: ')
  4330.     test=getinput(1 1 pen3'Do you want other users to see your STREET address? (Ny) > 'def)
  4331.     IF test='Y' THEN data.8=data.8 'STREET'
  4332.     test=getinput(1 1 pen3'Do you want other users to see your PHONE number? (Ny) > 'def)
  4333.     IF test='Y' THEN data.8=data.8 'PHONE'
  4334.     IF bbsprefs.7>0 THEN
  4335.       DO
  4336.         data.20=bbsprefs.7
  4337.         data.11='60 minutes' bbsprefs.16-1 'more times today'
  4338.       END
  4339.     SAY
  4340.     CALL SetData()
  4341.     IF data.20=0 THEN
  4342.       SAY 'Thank you, the sysop will give you higher access soon.'
  4343.     ELSE IF bbsprefs.25=1 THEN
  4344.       DO
  4345.         data.22=''
  4346.         data.23=''
  4347.         SAY
  4348.         SAY 'Setting message counters to last 10 messages in each conference...'
  4349.         DO i=1 TO level
  4350.           num=countcheck(bbspath'Numbers/LastMessage'i 0)-10
  4351.           IF num<0 | msg.i.0<10 THEN num=0
  4352.           lastread.i=num
  4353.           data.22=data.22 num
  4354.           data.23=data.23 0
  4355.         END
  4356.         SAY 'Setting file counter to last file uploaded...'
  4357.         lastbrowse=countcheck(bbspath'Numbers/LastFile' 0)
  4358.         newfilesdate='19900101 00:00:00'
  4359.       END
  4360.     SAY
  4361.     SAY 'Please feel free to leave additional info by using [C]omment.'
  4362.     SAY
  4363.     CALL saveData(1)
  4364.     SAY 'Adding' name 'to the user list...'
  4365.     newpassword=data.5
  4366.     sortuserflag=1
  4367.     temp=countcheck(bbspath'Numbers/Users' 0)+1
  4368.     CALL countcheck(bbspath'Numbers/Users' temp)
  4369.     CALL DELETE(bbspath'Lists/USERS')
  4370.   END
  4371. ELSE
  4372.   DO
  4373.     IF loadData()=0 THEN SIGNAL DONE
  4374.     PARSE VAR data.11 amins . atimes .
  4375.     lastondate=DATE('I',WORD(data.13,1),'S')
  4376.     lastontime=WORD(data.13,2)
  4377.     IF DATE('I')>lastondate | level>=sysoplevel THEN atimes=bbsprefs.16
  4378.     IF level=99 THEN amins=120
  4379.     data.13=DATE('S')'  'TIME()
  4380.     data.11=amins 'minutes' atimes-1 'more times today'
  4381.     passprompt='Enter Password: '
  4382.     DO tries=1 TO 3
  4383.       OPTIONS PROMPT passprompt
  4384.       PULL newpassword
  4385.       SAY ''
  4386.       IF(password=newpassword) THEN LEAVE tries; /* correct password */
  4387.       IF tries=3 THEN
  4388.         DO
  4389.           SAY 
  4390.           SAY 'Access terminated.'
  4391.           line='*** Bad password ***' newpassword '***'
  4392.           SAY line
  4393.           SIGNAL OUT2
  4394.         END
  4395.       SAY lineup'                                 '
  4396.       passprompt='Incorrect.  Password: ' /* ask again */
  4397.     END
  4398.   END
  4399. CALL DELAY(14)
  4400. SAY 
  4401. RETURN
  4402.  
  4403.  
  4404. saveData:
  4405. ARG messflag .
  4406. IF data.5='' THEN RETURN
  4407. SAY 'Updating...             'lineup
  4408. IF newfilesdate~='' THEN data.16=lastbrowse newfilesdate
  4409. ELSE IF lastbrowse>0 THEN
  4410.   DO
  4411.     IF WORDS(data.16)>1 THEN data.16=DELWORD(data.16,1,1)
  4412.     ELSE data.16=DATE('S') TIME()
  4413.     data.16=lastbrowse data.16
  4414.   END
  4415. IF messflag THEN
  4416.   DO
  4417.     userexclude.=0
  4418.     DO si=1 TO WORDS(data.22)
  4419.       IF WORD(data.22,si)=-1 THEN userexclude.si=1
  4420.     END
  4421.     data.22=''
  4422.     data.23=''
  4423.     DO si=1 TO 99
  4424.       IF ~DATATYPE(lastread.si,'W') THEN lastread.si=0
  4425.       IF userexclude.si THEN data.22=data.22 '-1'
  4426.       ELSE data.22=data.22 lastread.si
  4427.       IF ~DATATYPE(totwrit.si,'W') THEN totwrit.si=0
  4428.       data.23=data.23 totwrit.si
  4429.     END
  4430.   END
  4431. IF writeopen(bbspath'USERS/'name)=0 THEN RETURN
  4432. IF data.0<27 THEN data.0=27
  4433. DO i=1 TO data.0
  4434.   CALL WRITELN(f,data.i)
  4435. END
  4436. CALL CLOSE(f)
  4437. SAY 'User' name 'has been updated.'
  4438. RETURN
  4439.  
  4440.  
  4441. loadData:
  4442. IF name='' THEN RETURN 0
  4443. IF ~readopen(bbspath'USERS/'name) THEN RETURN 0
  4444. data.=''
  4445. DO i=1
  4446.   line=READLN(f)
  4447.   IF EOF(f) THEN BREAK
  4448.   data.i=line
  4449. END
  4450. data.0=i-1
  4451. CALL CLOSE(f)
  4452. winnings=WORD(data.18,1)
  4453. IF ~DATATYPE(winnings,'N') THEN winnings=0
  4454.  
  4455. setData:
  4456. IF WORDS(data.16)<3 THEN data.16='0 19900101 00:00:00'
  4457. lastbrowse=WORD(data.16,1)
  4458. IF ~DATATYPE(lastbrowse,'W') THEN lastbrowse=0
  4459. level=data.20
  4460. DO i=1 TO level
  4461.   lastread.i=WORD(data.22,i)
  4462.   IF ~DATATYPE(lastread.i,'W') THEN lastread.i=0
  4463.   totwrit.i=WORD(data.23,i)
  4464.   IF ~DATATYPE(totwrit.i,'W') THEN totwrit.i=0
  4465. END
  4466. password=data.5
  4467. IF ~DATATYPE(data.7,'W') THEN data.7=20
  4468. IF data.7<5 THEN data.7=5
  4469. IF FIND(UPPER(data.8),'TERSE')>0 THEN terseflag=1
  4470. ELSE terseflag=0
  4471. IF FIND(UPPER(data.8),'COLOR')>0 THEN colorflag=1
  4472. ELSE colorflag=0
  4473. CALL colors(colorflag)
  4474. menu='ALL'
  4475. IF FIND(UPPER(data.8),'MENUS')>0 THEN
  4476.   DO
  4477.     menuflag=1
  4478.     menu='MAIN'
  4479.   END
  4480. ELSE IF FIND(UPPER(data.8),'MENU')>0 THEN menuflag=1
  4481. ELSE menuflag=0
  4482. IF level=0 THEN menu='NEW'
  4483. data.21=UPPER(data.21)
  4484. maxtime=WORD(data.11,1)*60
  4485.  
  4486. loadFriends:
  4487. CALL MAKEDIR(bbspath'Friends')
  4488. alias.=''
  4489. alias.0=0
  4490. realname.=''
  4491. CALL CLOSE(f)
  4492. IF OPEN(f,bbspath'Friends/'name,'R')=0 THEN RETURN 1
  4493. DO i=1
  4494.   line=READLN(f)
  4495.   IF EOF(f) THEN LEAVE i
  4496.   alias.i=WORD(line,1)
  4497.   realname.i=WORD(line,2)
  4498. END
  4499. alias.0=i-1
  4500. CALL CLOSE(f)
  4501. RETURN 1
  4502.  
  4503.  
  4504. switchmenuflag:
  4505. IF menuflag=1 THEN
  4506.   DO
  4507.     menuflag=0
  4508.     noff='OFF'
  4509.   END
  4510. ELSE
  4511.   DO
  4512.     menuflag=1
  4513.     noff='ON'
  4514.   END
  4515. SAY 'Menus turned' pen3||noff||def'.'
  4516. SAY 'To make a permanent change, add or delete MENU(S) from [Y]our userdata item 8.'
  4517. RETURN
  4518.  
  4519.  
  4520. switchcolors:
  4521. IF colorflag=1 THEN
  4522.   DO
  4523.     colorflag=0
  4524.     noff='OFF'
  4525.   END
  4526. ELSE
  4527.   DO
  4528.     colorflag=1
  4529.     noff='ON'
  4530.   END
  4531. CALL colors(colorflag)
  4532. SAY 'Color turned' pen3||noff||def'.'
  4533. SAY 'To make a permanent change, add or delete COLOR from [Y]our userdata item 8.'
  4534. RETURN
  4535.  
  4536.  
  4537. /* ANSI pen color codes */
  4538. colors:
  4539. ARG onoff
  4540. IF onoff THEN
  4541.   DO
  4542.     lineup='1B'x'M'
  4543.     def='';  /* default */
  4544.     pen0='';  pen1='';  pen2='';  pen3=''
  4545.     pen4='';  pen5='';  pen6='';  pen7=''
  4546.     bak0='';  bak1='';  bak2='';  bak3=''
  4547.     bak4='';  bak5='';  bak6='';  bak7=''
  4548.   END
  4549. ELSE
  4550.   DO
  4551.     pen0=''; pen1=''; pen2=''; pen3=''; pen4=''; pen5=''; pen6=''; pen7=''
  4552.     bak0=''; bak1=''; bak2=''; bak3=''; bak4=''; bak5=''; bak6=''; bak7=''
  4553.     def='';  lineup=''
  4554.   END
  4555. RETURN
  4556.  
  4557.  
  4558. sortinfofiles:
  4559. infolist=SHOWDIR(bbspath'Information')
  4560. IF infolist='' THEN
  4561.   DO
  4562.     SAY 
  4563.     SAY pen3'No files are currently in the Information drawer.'def
  4564.     SAY 
  4565.     RETURN 1
  4566.   END
  4567. IF ~DATATYPE(sortinfo.0,'W') THEN
  4568.   DO
  4569.     info.=''
  4570.     sortinfo.=''
  4571.     info.0=WORDS(infolist)
  4572.     DO i=1 TO info.0
  4573.       info.i=WORD(infolist,i)
  4574.     END
  4575.     SAY 'Sorting..'
  4576.     CALL QSORT(1,info.0,info)
  4577.     sortinfo.0=info.0%3
  4578.     IF (info.0//3)>0 THEN sortinfo.0=sortinfo.0+1
  4579.     DO i=1 TO sortinfo.0
  4580.       sortinfo.i=''
  4581.       DO j=0 TO 2
  4582.         k=i+j*sortinfo.0
  4583.         IF k<=info.0 THEN
  4584.           DO
  4585.             sortinfo.i=sortinfo.i RIGHT(k,3)'.' LEFT(info.k,19)
  4586.             infocount=WORD(STATEF(bbspath'Information/'info.k),8)
  4587.             sortinfo.i.0=sortinfo.i.0||RIGHT(infocount,5) LEFT(info.k,19)
  4588.           END
  4589.       END
  4590.     END
  4591.     SAY lineup'         'lineup
  4592.   END
  4593. RETURN 0
  4594.  
  4595.  
  4596. information:
  4597. IF sortinfofiles() THEN RETURN
  4598. SAY pen3'These text files are available for reading online...'def
  4599. num=1
  4600. readcount=-1
  4601. DO infoloop=1
  4602.   IF num=0 THEN
  4603.     DO
  4604.       IF readcount~=-1 THEN
  4605.         DO
  4606.           sortinfo.0=''
  4607.           IF sortinfofiles() THEN RETURN
  4608.         END
  4609.       SAY CENTER('- Number of accesses per file -',75)
  4610.     END
  4611.   SAY pen3||LEFT('-',75,'-')||def
  4612.   DO i=1 TO sortinfo.0
  4613.     IF num=0 THEN SAY sortinfo.i.0
  4614.     ELSE SAY sortinfo.i
  4615.   END
  4616.   IF num=0 THEN
  4617.     DO
  4618.       CALL waiting()
  4619.       num=1
  4620.       ITERATE infoloop
  4621.     END
  4622.   num=getinput(1 0 pen3'Select Number Of Information File To View. 0=Stats > 'def)
  4623.   IF num=0 THEN ITERATE infoloop
  4624.   IF ~DATATYPE(num,'W') | num<1 | num>info.0 THEN RETURN
  4625.   readcount=STATEF(bbspath'Information/'info.num)
  4626.   readbytes=WORD(readcount,2)
  4627.   readcount=WORD(readcount,8)
  4628.   IF ~DATATYPE(readcount,'W') THEN readcount=0
  4629.   SAY '  'info.num 'is' readbytes 'bytes.'
  4630.   SAY 'Loading File...'
  4631.   ADDRESS COMMAND 'C:filenote' bbspath'Information/'info.num readcount+1
  4632.   CALL readlines(bbspath'Information/'info.num 1)
  4633.   CALL cleanline(0)
  4634.   SAY '    'lynes.0 'lines.'
  4635.   CALL seelines(0)
  4636.   IF waitchar~='Q' THEN CALL waiting()
  4637.   nonstop=0
  4638. END
  4639. RETURN
  4640.  
  4641.  
  4642. newfiles:
  4643. SAY 
  4644. test=''
  4645. test=getinput(1 1 'Show one library only? (Ny) > ')
  4646. IF test='Y' THEN
  4647.   IF chdir()>0 THEN RETURN
  4648. SAY 'Searching for new (un-browsed) files since' DATE(,WORD(data.16,2),'S') 'at' WORD(data.16,3)'...'
  4649. lastbrowz=WORD(data.16,1)
  4650. lastfileup=countcheck(bbspath'Numbers/LastFile' 0)
  4651.  
  4652. newfiles2:
  4653. IF lastbrowz>=lastfileup THEN
  4654.   DO
  4655.     lastbrowz=0
  4656.     SAY pen3'No new files. Listing backwards by date from last file uploaded...'def
  4657.   END
  4658. ELSE newfilesflag=1
  4659. j=0
  4660. IF test='Y' THEN
  4661.   DO
  4662.     filecount=WORDS(SHOWDIR(bbspath'FileNotes/'plaindir))
  4663.     CALL busywait(4 1)
  4664.   END
  4665. DO ni=lastfileup TO lastbrowz+1 BY -1
  4666.   IF files.ni~='' THEN
  4667.     DO
  4668.       IF test='Y' THEN 
  4669.         DO
  4670.           IF ni>1 THEN CALL busywait(60 ni lastfileup-lastbrowz)
  4671.           IF j>=filecount THEN LEAVE ni
  4672.           IF UPPER(LEFT(WORD(files.ni,1),12))~=UPPER(LEFT(plaindir,12)) THEN
  4673.             ITERATE ni
  4674.         END
  4675.       jj=files.ni.0
  4676.       IF WORD(alpha.jj,4)>level | FIND(data.21,UPPER(WORD(files.ni,1)))>0 THEN
  4677.         ITERATE ni  /* unauthorized */
  4678.       IF test='Y' THEN CALL busywait(4 0)
  4679.       j=j+1
  4680.       IF j=1 THEN CALL fileheader()
  4681.       SAY LEFT(alpha.jj,76)
  4682.       IF (j+2)//(linesperpage-1)=0 THEN
  4683.         IF waiting2() THEN LEAVE ni
  4684.       IF test='Y' THEN CALL busywait(4 1)
  4685.     END
  4686. END
  4687. IF test='Y' THEN CALL busywait(4 0)
  4688. IF j//linesperpage~=0 THEN CALL waiting()
  4689. IF j=0 & newfilesflag=1 THEN
  4690.   DO
  4691.     lastbrowz=999999
  4692.     newfilesflag=0
  4693.     CALL newfiles2()
  4694.   END
  4695. IF test~='Y' THEN
  4696.   DO
  4697.     CALL newinfo()
  4698.     IF lynes.0>0 THEN CALL waiting()
  4699.   END
  4700. nonstop=0
  4701. RETURN
  4702.  
  4703.  
  4704. newinfo:
  4705. lynes.=''
  4706. lynes.0=0
  4707. dm=DATE(,WORD(data.16,2),'S')
  4708. PARSE VAR dm da' 'mo' 'yr .
  4709. yr=RIGHT(yr,2)
  4710. sincedate=da'-'mo'-'yr
  4711. startline=1
  4712. arg=bbspath'Information'
  4713. IF WORD(STATEF(arg),5)>lastondate THEN
  4714.   DO
  4715.     ADDRESS COMMAND 'C:LIST >ram:locdirlist' arg 'NOHEAD DATES SINCE' sincedate
  4716.     IF WORD(STATEF('ram:locdirlist'),2)>3 THEN
  4717.       DO
  4718.         lynes.startline=pen1||bak2' New or Updated Information Files. Enter'def pen3'I'def bak2'from the main menu to read 'def
  4719.         CALL readlines('ram:locdirlist' startline+1)
  4720.       END
  4721.   END
  4722. arg=bbspath'Profiles'
  4723. IF level>0 & WORD(STATEF(arg),5)>lastondate THEN
  4724.   DO
  4725.     ADDRESS COMMAND 'C:LIST >ram:locdirlist' arg 'NOHEAD DATES SINCE' sincedate
  4726.     IF WORD(STATEF('ram:locdirlist'),2)>3 THEN
  4727.       DO
  4728.         startline=lynes.0+2
  4729.         lynes.startline=pen1||bak2' New or Updated User Profiles. Enter'def pen3'&'def bak2'from the main menu to read 'def
  4730.         CALL readlines('ram:locdirlist' startline+1)
  4731.       END
  4732.   END
  4733. arg=bbspath'rexxDoors/Data/Polls'
  4734. IF level>0 & WORD(STATEF(arg),5)>lastondate THEN
  4735.   DO
  4736.     startline=lynes.0+2
  4737.     lynes.startline=pen1||bak2' Voting Activity. Enter'def pen3'J'def bak2'from the main menu, then select Polling_Place 'def
  4738.     lynes.0=startline
  4739.   END
  4740. IF logonflag=1 THEN nonstop=1
  4741. IF lynes.0>0 THEN CALL seelines(1)
  4742. nonstop=0
  4743. RETURN
  4744.  
  4745.  
  4746. areaselect:
  4747. SAY pen3||LEFT('-',75,'-')||def
  4748. DO i=1 TO msgs.0
  4749.   SAY msgs.i
  4750.   IF i//linesperpage=0 THEN CALL waiting()
  4751. END
  4752. temp=getinput(1 0 pen3'Select Message Conference: 'def)
  4753. IF ~DATATYPE(temp,'W') | temp<1 | temp>level | FIND(data.21,temp)>0 THEN RETURN 1
  4754. msgdir=temp
  4755. RETURN 0
  4756.  
  4757.  
  4758. chdir:
  4759. string=''
  4760. SAY pen3||LEFT('-',75,'-')||def
  4761. DO i=1 TO libs.0
  4762.   SAY libs.i
  4763. END
  4764. dirnum=getinput(1 0 pen3'Select Library Number: 'def)
  4765. IF ~DATATYPE(dirnum,'W') THEN
  4766.   DO
  4767.     waitchar=dirnum
  4768.     RETURN 2
  4769.   END
  4770.  
  4771. chdir2:
  4772. IF dirnum<1 | dirnum>99 THEN
  4773.   DO
  4774.     waitchar=dirnum
  4775.     RETURN 1
  4776.   END
  4777. IF dirs.dirnum='' THEN
  4778.   DO
  4779.     SAY pen3'That library number is currently un-assigned.'def
  4780.     RETURN 1
  4781.   END
  4782. IF dirnum>level | FIND(data.21,UPPER(dirs.dirnum))>0 THEN
  4783.   DO
  4784.     SAY pen3'You do not have authorization for that library!'def
  4785.     RETURN 1
  4786.   END
  4787. CALL MAKEDIR(libpath||dirs.dirnum)
  4788. CALL setdir(libpath||dirs.dirnum)
  4789. t=libpath||plaindir'.txt'
  4790. IF ~EXISTS(t) THEN RETURN 0
  4791. nonstop=1
  4792. SAY
  4793. CALL readlines(t 1)
  4794. CALL seelines(1)
  4795. SAY
  4796. nonstop=0
  4797. RETURN 0
  4798.  
  4799.  
  4800. since:
  4801. dm=DATE(,WORD(data.16,2),'S')
  4802. SAY 
  4803. SAY 'New files or files moved since' dm
  4804. CALL listsince()
  4805. CALL readlines('ram:locdirlist' 1)
  4806. CALL seelines(1)
  4807. nonstop=0
  4808. CALL waiting()
  4809. RETURN
  4810.  
  4811.  
  4812. listsince:
  4813. dm=DATE(,WORD(data.16,2),'S')
  4814. PARSE VAR dm da' 'mo' 'yr .
  4815. yr=RIGHT(yr,2)
  4816. sincedate=da'-'mo'-'yr
  4817. ADDRESS COMMAND 'C:list >ram:locdirlist' directory 'DATES SINCE' sincedate
  4818. RETURN
  4819.  
  4820.  
  4821. list:
  4822. onetime=0
  4823. IF DATATYPE(arg,'W') THEN onetime=1
  4824. ELSE arg=''
  4825. DO listloop=1
  4826.   IF DATATYPE(arg,'W') THEN
  4827.     DO
  4828.       dirnum=arg
  4829.       arg=''
  4830.       IF chdir2()>0 THEN RETURN
  4831.       CALL listsimple()
  4832.       IF waitchar='Q' | onetime THEN LEAVE listloop
  4833.     END
  4834.   ELSE IF arg='' THEN
  4835.     DO
  4836.       IF chdir()>0 THEN RETURN
  4837.       test='Y'
  4838.       CALL showalpha2()
  4839.       arg=''
  4840.       IF waitchar='Q' THEN waitchar=''
  4841.       IF waitchar~='' THEN RETURN
  4842.       ITERATE listloop
  4843.     END
  4844.   ELSE RETURN
  4845. END
  4846. RETURN
  4847.  
  4848.  
  4849. listsimple:
  4850. ADDRESS COMMAND 'C:list >ram:locdirlist' directory 'DATES'
  4851. IF readlines('ram:locdirlist' 1) THEN RETURN
  4852. IF lynes.0>3 THEN
  4853.   DO
  4854.     SAY pen3'Sorting...'def||lineup
  4855.     linesave=lynes.1  /* these 4 lines put in to leave dir title at top */
  4856.     lynes.1='0'
  4857.     CALL QSORT(1,lynes.0-1,lynes)
  4858.     CALL DELAY(14)
  4859.     lynes.1=linesave
  4860.   END
  4861. CALL seelines(1)
  4862. nonstop=0
  4863. CALL waiting()
  4864. RETURN
  4865.  
  4866.  
  4867. browse:
  4868. curdironly=0
  4869. brdir=PRAGMA('D')
  4870. brfilenum=1
  4871. nonstop=0
  4872. IF files.0<1 THEN RETURN
  4873. lastfilenum=countcheck(bbspath'Numbers/LastFile' 0)
  4874. IF lastfilenum<1 THEN RETURN
  4875. onearg=0
  4876. IF arg='' THEN
  4877.   DO
  4878.     lin='Browsing'
  4879.     test=getinput(1 1 'Browse one library only? (Ny) > ')
  4880.     IF test='Y' THEN
  4881.       DO
  4882.         IF chdir()>0 THEN RETURN
  4883.         curdironly=1
  4884.         lin=lin 'the' pen3||plaindir||def 'library'
  4885.         t=libpath||plaindir'.txt'
  4886.         IF level>sysoplevel THEN
  4887.           IF getinput(1 1 'Edit the'pen3 Plaindir def'library info file? (Ny) > ')='Y' THEN
  4888.             DO
  4889.               IF ~EXISTS(t) THEN
  4890.                 DO
  4891.                   IF writeopen(t)~=0 THEN
  4892.                     DO
  4893.                       CALL WRITELN(f,TRIM(CENTER('***' plaindir '***',77)))
  4894.                       CALL WRITELN(f,LEFT('',75,'='))
  4895.                       CALL CLOSE(f)
  4896.                       CALL DELAY(28)
  4897.                     END
  4898.                 END
  4899.               CALL bbsED(1 t)
  4900.               RETURN
  4901.             END
  4902.       END
  4903.     ELSE lin=lin 'all file libraries'
  4904.     lin=lin 'backwards from latest file.'
  4905.     SAY lin
  4906.     SAY
  4907.   END
  4908. ELSE onearg=1
  4909. i=0
  4910. IF arg='' | UPPER(arg)='NEW' | UPPER(arg)='ALL' THEN
  4911.   DO lastfileloop=1
  4912.     IF lastfilenum<1 THEN RETURN
  4913.     arg=WORD(files.lastfilenum,2)
  4914.     brfilenum=lastfilenum
  4915.     IF WORD(files.lastfilenum,2)~='' THEN LEAVE lastfileloop
  4916.     lastfilenum=lastfilenum-1
  4917.   END
  4918. ELSE IF DATATYPE(arg,'W') & files.arg~='' THEN
  4919.   DO
  4920.     brfilenum=arg
  4921.     arg=WORD(files.arg,2)
  4922.     IF arg='' THEN
  4923.       DO
  4924.         SAY 'File number' brfilenum 'does not exist in the current libraries!'
  4925.         RETURN
  4926.       END
  4927.   END
  4928. ELSE
  4929.   DO
  4930.     IF onearg THEN CALL busywait(4 1)
  4931.     DO ni=lastfilenum TO 1 BY -1
  4932.       IF onearg THEN CALL busywait(60 ni lastfilenum)
  4933.       IF UPPER(WORD(files.ni,2))~=UPPER(arg) THEN ITERATE ni
  4934.       brfilenum=ni
  4935.       CALL busywait(4 0)
  4936.       LEAVE ni
  4937.     END
  4938.     IF ni<1 THEN
  4939.       DO
  4940.         SAY 'Unable to find a file description for' pen3||arg||def'.'
  4941.         RETURN
  4942.       END
  4943.   END
  4944. IF ~curdironly THEN CALL setdir(libpath||WORD(files.brfilenum,1))
  4945. savearg=arg
  4946. IF brfilenum>lastfilenum THEN brfilenum=lastfilenum
  4947. newfilesdate=DATE('S') TIME()
  4948. DO browseloop=1
  4949.   IF curdironly THEN CALL busywait(4 1)
  4950.   DO ni=brfilenum TO 0 BY -1
  4951.     IF ni=0 THEN LEAVE browseloop
  4952.     IF files.ni='' THEN ITERATE ni
  4953.     IF onearg THEN
  4954.       DO
  4955.         CALL busywait(60 ni lastfilenum)
  4956.         IF UPPER(arg)=UPPER(WORD(files.ni,2)) THEN LEAVE ni
  4957.         ELSE ITERATE ni
  4958.       END
  4959.     testdir=UPPER(WORD(files.ni,1))
  4960.     IF curdironly & UPPER(plaindir)~=UPPER(testdir) THEN
  4961.       DO
  4962.         IF ni>lastbrowse THEN lastbrowse=ni
  4963.         IF ni>0 THEN CALL busywait(60 ni lastfilenum)
  4964.         ITERATE ni
  4965.       END
  4966.     IF FIND(data.21,testdir)>0 | finddirnum(testdir)>level THEN
  4967.       DO
  4968.         IF ni>lastbrowse THEN lastbrowse=ni
  4969.         ITERATE ni
  4970.       END
  4971.     LEAVE ni
  4972.   END
  4973.   IF curdironly | onearg THEN CALL busywait(4 0)
  4974.   onearg=0
  4975.   IF ni=0 THEN brfilenum=lastbrowse
  4976.   ELSE brfilenum=ni
  4977.   argname=WORD(files.brfilenum,2)
  4978.   IF argname='' THEN RETURN
  4979.   CALL setdir(libpath||WORD(files.brfilenum,1))
  4980.   arg=bbspath'FileNotes/'plaindir'/'argname
  4981.   CALL readlines(arg 1)
  4982.   IF nonstop=1 THEN brostop=1
  4983.   ELSE brostop=0
  4984.   CALL seelines(1)
  4985.   IF brfilenum>lastbrowse THEN lastbrowse=brfilenum
  4986.   IF brostop THEN
  4987.     DO
  4988.       SAY
  4989.       nonstop=1
  4990.       brfilenum=brfilenum-1
  4991.     END
  4992.   ELSE
  4993.     DO
  4994.       line=''
  4995.       endtest=UPPER(RIGHT(argname,4))
  4996.       IF FIND('.ARC .ARJ .DMS .LZH .LHA .RUN .ZIP .ZOO',endtest)>0 THEN
  4997.         line='['pen3'C'def']ontents ['pen3'D'def']ownload'
  4998.       ELSE line='['pen3'D'def']ownload'
  4999.       IF level>sysoplevel | name=WORD(lynes.3,2) THEN
  5000.         line=line '['pen3'E'def']dit'
  5001.       IF level>sysoplevel | name=WORD(lynes.3,2) THEN
  5002.         line=line '['pen3'K'def']ill'
  5003.       IF level>sysoplevel THEN line=line '['pen3'L'def']ib'
  5004.       line=line '['pen3'M'def']ark ['pen3'N'def']on-Stop'
  5005.       IF endtest='.TXT' THEN line=line '['pen3'R'def']ead'
  5006.       line=line '['pen3'Q'def']uit ['pen3'?'def'] > '
  5007.       brcom=getinput(1 0 line)
  5008.       IF DATATYPE(brcom,'W') THEN
  5009.         DO
  5010.           brfilenum=brcom+1
  5011.           IF brfilenum>lastfilenum THEN brfilenum=lastfilenum+1
  5012.           IF brfilenum<1 THEN brfilenum=1
  5013.           SAY
  5014.         END
  5015.       ELSE brcom=LEFT(brcom,1)
  5016.       CALL cleanline(0)
  5017.       IF brcom='Q' THEN LEAVE browseloop
  5018.       IF brcom='M' THEN
  5019.         DO
  5020.           wordnum=FIND(data.25,brfilenum)
  5021.           IF wordnum=0 THEN
  5022.             DO
  5023.               data.25=STRIP(data.25 brfilenum)
  5024.               SAY lineup||argname 'marked for next download.'
  5025.               SAY
  5026.             END
  5027.           ELSE
  5028.             DO
  5029.               data.25=STRIP(DELWORD(data.25,wordnum,1))
  5030.               SAY argname 'removed from download list.'
  5031.             END
  5032.         END
  5033.       IF brcom='H' | brcom='?' THEN
  5034.         DO
  5035.           SAY pen3' - HELP with the Browse Files commands -'def
  5036.           SAY ' RETURN reads the next file description in line.'
  5037.           SAY ' 34 will display the description of file number 34, if it exists.'
  5038.           SAY ' C  displays the contents of an archived (arc dms lzh lha zip zoo) file.'
  5039.           SAY ' D  displays the download menu.'
  5040.           IF level>sysoplevel | name=WORD(lynes.3,2) THEN
  5041.             DO
  5042.           SAY ' E  puts this file description into the online Editor.'
  5043.           SAY ' K  deletes a file you uploaded. you cannot Kill others!'
  5044.             END
  5045.           IF level>sysoplevel THEN
  5046.           SAY ' L  move file and description to new Library and/or rename.'
  5047.           SAY ' M  mark/unmark the current file for the next download'
  5048.           SAY ' N  displays all descriptions without pausing. CTRL-E to Exit!'
  5049.           SAY ' R  displays file as text. - ONLY FILES THAT END IN .TXT -'
  5050.           SAY ' Q  returns to the main menu(s). (Quit)'
  5051.           SAY
  5052.           CALL waiting()
  5053.           IF waitchar='Q' THEN LEAVE browseloop
  5054.         END
  5055.       ELSE IF brcom='L' & level>sysoplevel THEN
  5056.         DO
  5057.           curdir=PRAGMA('D')
  5058.           IF getinput(1 1 'Rename' argname '? (Ny) > ')='Y' THEN
  5059.             DO
  5060.               newarg=getinput(0 0 'Rename' argname 'to ')
  5061.               IF newarg~='' THEN
  5062.                 DO
  5063.                   IF is_here(newarg) THEN ITERATE browseloop
  5064.                   IF wi=999999 THEN ITERATE browseloop
  5065.                   IF EXISTS(libpath||filedir'/'newarg) THEN
  5066.                     DO
  5067.                       SAY
  5068.                       SAY '***' newarg 'already exists!'
  5069.                       SAY
  5070.                       ITERATE browseloop
  5071.                     END
  5072.                   junk=getinput(1 1 'Are you SURE you want to rename' argname 'to' newarg'? (Ny) ')
  5073.                   IF junk='Y' THEN
  5074.                     DO
  5075.                       lynes.2=OVERLAY(newarg,lynes.2,7,25)
  5076.                       comment=WORD(STATEF(arg),8)
  5077.                       CALL DELETE(arg)
  5078.                       arg=bbspath'FileNotes/'plaindir'/'newarg
  5079.                       CALL savelines(arg)
  5080.                       IF comment='' THEN
  5081.                         DO
  5082.                           mpath=libpath||plaindir
  5083.                           IF RENAME(mpath'/'argname,mpath'/'newarg)=0 THEN
  5084.                             SAY 'Rename failed on main file!'
  5085.                         END
  5086.                       ELSE
  5087.                         DO
  5088.                           t=LASTPOS('/',comment)
  5089.                           IF t=0 THEN t=LASTPOS(':',comment)
  5090.                           mpath=LEFT(comment,t-1)
  5091.                           IF RENAME(comment,mpath'/'newarg)=1 THEN
  5092.                             ADDRESS COMMAND 'C:FileNote' arg mpath'/'newarg
  5093.                           ELSE SAY 'Rename failed on external file!'
  5094.                         END
  5095.                       files.brfilenum=STRIP(WORD(files.brfilenum,1)) newarg
  5096.                       anum=files.brfilenum.0
  5097.                       alpha.anum=OVERLAY(newarg,alpha.anum,1,WORDINDEX(alpha.anum,2)-2)
  5098.                       argname=newarg
  5099.                       sortalphaflag=1
  5100.                       savefileflag=1
  5101.                     END
  5102.                 END
  5103.             END
  5104.           mvdir=getinput(0 0 'Move' argname 'to Library (name|number) ')
  5105.           IF mvdir~='' THEN
  5106.             DO
  5107.               IF DATATYPE(mvdir,'W') THEN
  5108.                 DO
  5109.                   dirnum=mvdir
  5110.                   IF UPPER(dirs.dirnum)~=UPPER(WORD(files.brfilenum,1)) THEN
  5111.                     DO
  5112.                       IF chdir2()=0 THEN
  5113.                         DO
  5114.                           CALL readlines(arg 1)
  5115.                           CALL movefile(brfilenum dirs.dirnum)
  5116.                         END
  5117.                     END
  5118.                 END
  5119.               ELSE
  5120.                 DO
  5121.                   mvdir=STRIP(mvdir)
  5122.                   IF UPPER(mvdir)~=UPPER(WORD(files.brfilenum,1)) THEN
  5123.                     DO
  5124.                       DO mj=1 TO level+1
  5125.                         IF UPPER(mvdir)=UPPER(dirs.mj) THEN LEAVE mj
  5126.                       END
  5127.                       IF mj<=level THEN CALL movefile(brfilenum mvdir)
  5128.                     END
  5129.                 END
  5130.             END
  5131.           IF savefileflag>0 THEN CALL savefilelist()
  5132.           CALL setdir(curdir)
  5133.         END
  5134.       ELSE IF brcom='N' THEN
  5135.         DO
  5136.           brfilenum=brfilenum-1
  5137.           nonstop=1
  5138.           SAY pen3'To EXIT non-stop scrolling of text, press CTRL-E'def
  5139.           SAY
  5140.           CALL DELAY(100)
  5141.           brcom=''
  5142.         END
  5143.       ELSE IF brcom='C' THEN
  5144.         DO
  5145.           temp=STRIP(WORD(STATEF(arg),8))
  5146.           IF temp='' THEN temp=libpath||plaindir'/'argname
  5147.           CALL Contents.rexx(temp)
  5148.           IF EXISTS('RAM:CONTENTS') THEN
  5149.             DO
  5150.               CALL readlines('RAM:CONTENTS' 1)
  5151.               CALL seelines(0)
  5152.               IF waitchar~='Q' THEN CALL waiting()
  5153.               nonstop=0
  5154.             END
  5155.           ELSE SAY pen3'Not an archived file.'def
  5156.         END
  5157.       ELSE IF brcom='D' THEN
  5158.         DO
  5159.           arg2=arg
  5160.           arg=brfilenum
  5161.           CALL dload()
  5162.           arg=arg2
  5163.         END
  5164.       ELSE IF brcom='E' THEN
  5165.         DO
  5166.           IF level>sysoplevel | name=WORD(lynes.3,2) THEN
  5167.             DO
  5168.               firstedit=5
  5169.               IF level>sysoplevel THEN firstedit=1
  5170.               CALL bbsED(firstedit arg)
  5171.             END
  5172.         END
  5173.       ELSE IF brcom='K' THEN
  5174.         DO
  5175.           IF level>sysoplevel | name=WORD(lynes.3,2) THEN
  5176.             DO
  5177.               IF getinput(1 1 pen3'Do you really want to kill this file? (nY) >'def)~='N' THEN
  5178.                 DO
  5179.                   tempnum=WORD(lynes.1,2)
  5180.                   IF tempnum=lastfilenum THEN
  5181.                     DO
  5182.                       CALL DELETE(bbspath'Numbers/LastFile')
  5183.                       CALL DELAY(28)
  5184.                       lastfilenum=lastfilenum-1
  5185.                       CALL countcheck(bbspath'Numbers/LastFile' lastfilenum)
  5186.                     END
  5187.                   files.tempnum=''
  5188.                   tempnum2=files.tempnum.0
  5189.                   alpha.tempnum2='0 0' tempnum '100'
  5190.                   CALL savefilelist()
  5191.                   finfo=STATEF(arg)
  5192.                   IF WORDS(finfo)>7 THEN argname=WORD(finfo,8)
  5193.                   CALL DELETE(argname)
  5194.                   CALL DELETE(arg)
  5195.                   SAY argname pen3'has been deleted.'def
  5196.                 END
  5197.             END
  5198.         END
  5199.       ELSE IF brcom='R' & endtest='.TXT' THEN
  5200.         DO
  5201.           vcount=WORD(lynes.2,7)+1
  5202.           lynes.2=STRIP(DELWORD(lynes.2,7,1)) vcount
  5203.           edtype=''
  5204.           CALL savelines(arg)
  5205.           CALL showtext(argname)
  5206.         END
  5207.       ELSE brfilenum=brfilenum-1
  5208.     END
  5209. END
  5210. CALL setdir(brdir)
  5211. waitchar=''
  5212. IF nonstop THEN CALL waiting()
  5213. nonstop=0
  5214. CALL savedata(0)
  5215. RETURN
  5216.  
  5217.  
  5218. movefile:
  5219. PARSE ARG fnum movdir .
  5220. fromdir=STRIP(WORD(files.fnum,1))
  5221. farg=STRIP(WORD(files.fnum,2))
  5222. CALL MAKEDIR(libpath||movdir)
  5223. ADDRESS COMMAND 'C:COPY' libpath||fromdir'/'farg libpath||movdir
  5224. IF EXISTS(libpath||movdir'/'farg) THEN CALL DELETE(libpath||fromdir'/'farg)
  5225. files.fnum=movdir farg
  5226. lynes.3=DELWORD(lynes.3,WORDS(lynes.3),1)
  5227. lynes.3=STRIP(lynes.3) movdir
  5228. CALL MAKEDIR(bbspath'FileNotes/'movdir)
  5229. CALL savelines(bbspath'FileNotes/'movdir'/'farg)
  5230. ndx=files.fnum.0
  5231. dnum=finddirnum(movdir)
  5232. alpha.ndx=OVERLAY(RIGHT(dnum,2) movdir,alpha.ndx,31,15)
  5233. IF EXISTS(bbspath'FileNotes/'movdir'/'farg) THEN
  5234.   DO
  5235.     temp=bbspath'FileNotes/'fromdir'/'farg
  5236.     comment=WORD(STATEF(temp),8)
  5237.     CALL DELETE(temp)
  5238.     IF comment~='' THEN
  5239.       ADDRESS COMMAND 'C:FileNote' bbspath'FileNotes/'movdir'/'farg comment
  5240.   END
  5241. savefileflag=1
  5242. line='Moved:' fromdir'/'farg 'to' movdir
  5243. SAY line
  5244. RETURN
  5245.  
  5246.  
  5247. textsearch:
  5248. PARSE ARG sfile' 'sarg
  5249. IF sarg='' THEN RETURN 0
  5250. x=OPEN(f,sfile,'R')
  5251. IF x=0 THEN RETURN 0
  5252. sarg=UPPER(sarg)
  5253. stemp=UPPER(READCH(f,65000))
  5254. CALL CLOSE(f)
  5255. retflag=0
  5256. IF POS(sarg,stemp)>0 THEN retflag=1
  5257. DROP stemp
  5258. RETURN retflag
  5259.  
  5260.  
  5261. bbsSEARCH:
  5262. smenu=menu
  5263. test=UPPER(LEFT(arg,1))
  5264. IF test='F' THEN smenu='FILE'
  5265. IF test='M' THEN smenu='MSG'
  5266. IF test='U' THEN smenu='MAIN'
  5267. IF smenu='ALL' THEN
  5268.   DO
  5269.     junk=getinput(1 1 'Search ['pen3'F'def']iles ['pen3'M'def']essages or ['pen3'U'def']sers (fmu) > ')
  5270.     IF junk='F' THEN smenu='FILE'
  5271.     ELSE IF junk='M' THEN smenu='MSG'
  5272.     ELSE IF junk='U' THEN smenu='MAIN'
  5273.     ELSE RETURN
  5274.   END
  5275. IF WORDS(arg)>1 THEN searcharg=UPPER(SUBSTR(arg,WORDINDEX(arg,2)))
  5276. ELSE searcharg=getinput(0 0 pen3'Search Phrase: 'def)
  5277. IF LENGTH(STRIP(searcharg))=0 THEN RETURN
  5278. searcharg=COMPRESS(searcharg,'*')
  5279. IF smenu='NEW' | smenu='MAIN' THEN
  5280.   DO
  5281.     SAY 'Searching Userlist...'
  5282.     DO i=1 TO WORDS(userlist)
  5283.       IF POS(UPPER(searcharg),UPPER(WORD(userlist,i)))>0 THEN
  5284.         SAY WORD(userlist,i)
  5285.     END
  5286.   END
  5287. IF smenu='MSG' THEN
  5288.   DO
  5289.     IF getinput(1 1 'Search one conference only? (Ny) > ')='Y' THEN
  5290.       DO
  5291.         IF areaselect() THEN RETURN
  5292.         SAY 'Searching' msg.msgdir 'Message Conference for'pen3 searcharg||def'...'
  5293.         SAY
  5294.         CALL searchmsgdir()
  5295.       END
  5296.     ELSE
  5297.       DO
  5298.         SAY 'Searching All Public Message Conferences for'pen3 searcharg||def'...'
  5299.         SAY
  5300.         DO i=1 TO level
  5301.           msgdir=i
  5302.           IF msg.msgdir='' | FIND(data.21,msgdir)>0 THEN ITERATE i
  5303.           CALL searchmsgdir()
  5304.           i=msgdir
  5305.           IF msgcom='Q' THEN i=999999
  5306.         END
  5307.       END
  5308.   END
  5309. IF smenu='FILE' THEN
  5310.   DO
  5311.     line=pen3'Searching'
  5312.     curdironly=0
  5313.     IF getinput(1 1 'Search one library only? (Ny) > ')='Y' THEN
  5314.       DO
  5315.         IF chdir()>0 THEN RETURN
  5316.         curdironly=1
  5317.         line=line 'the' pen3||plaindir||def 'library'
  5318.         SAY
  5319.       END
  5320.     ELSE
  5321.       DO
  5322.         line=line 'all file libraries'
  5323.         SAY
  5324.         SAY pen3'WARNING!'def 'Searching' RIGHT(files.0,5) '['pen3'F'def']ull descriptions may take'pen3 TRUNC(files.0/(114*cpu)+.05,1) def'minutes!'
  5325.       END
  5326.     test=getinput(1 1 '   ['pen3'A'def']lphaList search or ['pen3'F'def']ull descriptions? (Afq) > ')
  5327.     IF test='Q' THEN RETURN
  5328.     SAY
  5329.     SAY line 'for'def UPPER(searcharg)
  5330.     SAY pen3' - To ABORT, press CTRL-E -'def
  5331.     SAY
  5332.     IF test~='F' THEN
  5333.       DO
  5334.         CALL fileheader()
  5335.         DO i=1 TO alpha.0
  5336.           CALL busywait(60 i alpha.0)
  5337.           ii=WORD(alpha.i,4)
  5338.           IF ii>level THEN ITERATE i
  5339.           IF curdironly=1 & ii~=dirnum THEN ITERATE i
  5340.           ii=WORD(alpha.i,3)
  5341.           IF POS(UPPER(WORD(files.ii,1)),data.21)>0 THEN ITERATE i
  5342.           tempnum=POS(UPPER(searcharg),UPPER(alpha.i))
  5343.           IF tempnum>0 THEN
  5344.             DO
  5345.               CALL busywait(4 0)
  5346.               SAY alpha.i
  5347.               IF colorflag=1 THEN
  5348.                 SAY pen3||LEFT(' ',tempnum-1)||lineup||UPPER(searcharg)||def
  5349.               CALL busywait(4 1)
  5350.             END
  5351.         END
  5352.       END
  5353.     ELSE
  5354.       DO
  5355.         cck=countcheck(bbspath'Numbers/LastFile' 0)
  5356.         nonstop=1
  5357.         DO i=1 TO cck
  5358.           iii=cck+1-i
  5359.           IF files.iii='' THEN ITERATE i
  5360.           ii=files.iii.0
  5361.           ii=WORD(alpha.ii,4)
  5362.           IF ii>level THEN ITERATE i
  5363.           IF curdironly=1 & ii~=dirnum THEN ITERATE i
  5364.           IF POS(UPPER(WORD(files.iii,1)),data.21)>0 THEN ITERATE i
  5365.           farg=WORD(files.iii,1)'/'WORD(files.iii,2)
  5366.           SAY '1B'x'M' RIGHT(farg,40) LEFT(iii,7)
  5367.           IF textsearch(bbspath'FileNotes/'farg searcharg) THEN
  5368.             DO
  5369.               savei=i
  5370.               CALL readlines(bbspath'FileNotes/'farg 1)
  5371.               CALL seelines(2)
  5372.               i=savei
  5373.               SAY
  5374.               SAY
  5375.             END
  5376.         END
  5377.       END
  5378.     CALL busywait(4 0)
  5379.   END
  5380. searcharg=''
  5381. nonstop=0
  5382. SAY
  5383. IF i<999999 THEN SAY 'All available items have been searched.'
  5384. SAY
  5385. CALL waiting()
  5386. RETURN
  5387.  
  5388.  
  5389. searchmsgdir:
  5390. msglist=SHOWDIR(msgpath||msgdir)
  5391. IF WORDS(msglist)>0 THEN SAY lineup||RIGHT(msg.msgdir,40)
  5392. qi=WORDS(msglist)
  5393. DO wi=1 TO qi
  5394.   CALL busywait(8 wi qi)
  5395.   messnum=WORD(msglist,wi)%1
  5396.   IF textsearch(msgpath||msgdir'/'messnum searcharg) THEN
  5397.     DO
  5398.       CALL busywait(4 0)
  5399.       savelast=lastread.msgdir
  5400.       CALL readmsg(0 messnum)
  5401.       lastread.msgdir=savelast
  5402.       IF msgcom='Q' THEN RETURN
  5403.       CALL busywait(4 1)
  5404.     END
  5405. END
  5406. CALL busywait(4 0)
  5407. RETURN
  5408.  
  5409.  
  5410. finddirnum:
  5411. ARG fdirname .
  5412. DO fdir=1 TO 99
  5413.   IF UPPER(dirs.fdir)=UPPER(fdirname) THEN RETURN fdir
  5414. END
  5415. RETURN 100
  5416.  
  5417.  
  5418. writebuffer:
  5419. PARSE ARG bufname .
  5420. CALL DELETE(bufname)
  5421. startnum=lynes.0+1
  5422. OPTIONS PROMPT ''
  5423. SAY pen3'LOCAL logon! Input cannot exceed 250 characters per line!'def
  5424. SAY 'Type 'pen3'/E'def 'or' pen3'/S'def' on a new line to exit and' pen3'DO YOUR OWN WORDWRAP!'def
  5425. DO bufloop=startnum
  5426.   PARSE PULL line
  5427.   IF LEFT(UPPER(STRIP(line)),2)='/E' | LEFT(UPPER(STRIP(line)),2)='/S' THEN
  5428.     LEAVE bufloop
  5429.   lynes.bufloop=line
  5430. END
  5431. lynes.0=bufloop-1
  5432. CALL wrapbuf(startnum)
  5433. CALL DELETE(bufname)     /* these 4 lines make wordwrap more consistent */
  5434. CALL savelines(bufname)
  5435. CALL readlines(bufname 1)
  5436. CALL wrapbuf(startnum)
  5437. RETURN
  5438.  
  5439.  
  5440. wrapbuf:
  5441. ARG startnum .
  5442. CALL cleanline(1)
  5443. SAY pen3'Wordwrapping...'def
  5444. lynes.startnum=TRANSLATE(lynes.startnum,' ','09'x)
  5445. lynes.startnum=COMPRESS(lynes.startnum,'0C'x)  /* no FF */
  5446. DO wi=startnum WHILE wi<=lynes.0
  5447.   wj=wi+1
  5448.   lynes.wj=COMPRESS(lynes.wj,'08'x||'0C'x||'7F'x)
  5449.   tabpos=POS('09'x,lynes.wi)
  5450.   DO WHILE tabpos>0
  5451.     lynes.wi=DELSTR(lynes.wi,tabpos,1)
  5452.     lynes.wi=INSERT('  ',lynes.wi,tabpos-1)
  5453.     tabpos=POS('09'x,lynes.wi)
  5454.   END
  5455.   IF LENGTH(lynes.wi)>75 THEN
  5456.     DO
  5457.       testchar=''
  5458.       IF lynes.wj~='' THEN testchar=LEFT(lynes.wj,1)
  5459.       IF testchar=' ' | testchar='.' | testchar=':' THEN
  5460.         DO
  5461.           DO wjj=lynes.0 TO wi+1 BY -1
  5462.             wk=wjj+1
  5463.             lynes.wk=lynes.wjj
  5464.           END
  5465.           lynes.wj=''
  5466.           lynes.0=lynes.0+1
  5467.         END
  5468.       DO wl=WORDS(lynes.wi) TO 1 BY -1 WHILE LENGTH(lynes.wi)>74
  5469.         IF WORDS(lynes.wi)=1 THEN
  5470.           lynes.wi=LEFT(lynes.wi,74) SUBSTR(lynes.wi,75)
  5471.         lynes.wj=WORD(lynes.wi,wl) lynes.wj
  5472.         lynes.wi=STRIP(DELWORD(lynes.wi,wl,1))
  5473.       END
  5474.     END
  5475. END
  5476. RETURN
  5477.  
  5478.  
  5479. seelines:
  5480. ARG fancy .
  5481. DO i=1 TO lynes.0
  5482.   IF fancy=0 THEN SAY lynes.i||def
  5483.   ELSE
  5484.     DO
  5485.       IF LEFT(lynes.i,2)=': ' & WORDS(lynes.i)=2 THEN ITERATE i
  5486.       ELSE IF LEFT(lynes.i,10)='Directory ' | LEFT(lynes.i,5)='=====' THEN
  5487.         SAY pen3||lynes.i||def
  5488.       ELSE SAY lynes.i
  5489.       IF fancy=2 & colorflag=1 & searcharg~='' THEN
  5490.         DO
  5491.           testpos=POS(UPPER(searcharg),UPPER(lynes.i))
  5492.           IF testpos>0 THEN
  5493.             SAY LEFT(' ',testpos-1)||pen3||lineup||UPPER(searcharg)||def
  5494.         END
  5495.     END
  5496.   IF i//linesperpage=0 THEN
  5497.     IF waiting2() THEN LEAVE i
  5498. END
  5499. nonstop=0
  5500. RETURN
  5501.  
  5502.  
  5503. readlines:
  5504. CALL CLOSE(f)
  5505. PARSE ARG tempname readstart .
  5506. IF ~readopen(tempname) THEN RETURN 1
  5507. IF readstart<2 THEN lynes.=''
  5508. DO ri=readstart
  5509.   line=READLN(f)
  5510.   IF EOF(f) THEN BREAK
  5511.   lynes.ri=line
  5512. END
  5513. lynes.0=ri-1
  5514. CALL CLOSE(f)
  5515. DO ri=lynes.0 TO 0 BY -1 WHILE LENGTH(lynes.ri)=0 | LEFT(UPPER(lynes.ri),2)='/E' | LEFT(UPPER(lynes.ri),2)='/S'
  5516. END
  5517. lynes.0=ri
  5518. RETURN 0
  5519.  
  5520.  
  5521. savelines:
  5522. PARSE ARG tempname .
  5523. IF EXISTS(tempname) & edtype='MAIL' THEN
  5524.   DO
  5525.     ok=OPEN(f,tempname,'A')
  5526.     IF ok~=0 THEN CALL WRITELN(f,LEFT('',74,'^'))
  5527.   END
  5528. ELSE ok=OPEN(f,tempname,'W')
  5529. IF ok=0 THEN
  5530.   DO
  5531.     line='***' tempname 'failed to open for saving!'
  5532.     SAY line
  5533.     RETURN 1
  5534.   END
  5535. DO wi=1 TO lynes.0
  5536.   CALL WRITELN(f,lynes.wi)
  5537. END
  5538. CALL CLOSE(f)
  5539. RETURN 0
  5540.  
  5541.  
  5542. loaduserlist:
  5543. userlist=SHOWDIR(bbspath'Users')
  5544. ulynes.=''
  5545. IF ~EXISTS(bbspath'Lists/USERS') THEN CALL sortuserlist()
  5546. ELSE IF readopen(bbspath'Lists/USERS') THEN
  5547.   DO
  5548.     SAY 'Loading Userlist...'
  5549.     DO lui=1
  5550.       line=READLN(f)
  5551.       IF EOF(f) THEN BREAK
  5552.       ulynes.lui=line
  5553.     END
  5554.     ulynes.0=lui-1
  5555.     CALL CLOSE(f)
  5556.   END
  5557. RETURN
  5558.  
  5559.  
  5560. saveuserlist:
  5561. SIGNAL OFF BREAK_E
  5562. IF writeopen(bbspath'Lists/USERS') THEN
  5563.   DO
  5564.     DO i=1 TO ulynes.0
  5565.       CALL WRITELN(f,ulynes.i)
  5566.     END
  5567.     CALL CLOSE(f)
  5568.   END
  5569. RETURN
  5570.  
  5571.  
  5572. sortuserlist:
  5573. SAY 'Rebuilding Userlist...'
  5574. sortuserflag=0
  5575. userlist=SHOWDIR(bbspath'Users')
  5576. user.=''
  5577. users=WORDS(userlist)
  5578. user.0=users
  5579. DO uli=1 TO users
  5580.   user.uli=WORD(userlist,uli)
  5581.   uscore=LASTPOS('_',user.uli)
  5582.   IF uscore>0 THEN user.uli=SUBSTR(user.uli,uscore+1)'@'LEFT(user.uli,uscore-1)
  5583. END
  5584. CALL QSORT(1,users,user)
  5585. DO uli=1 TO users
  5586.   uscore=POS('@',user.uli)
  5587.   IF uscore>0 THEN user.uli=SUBSTR(user.uli,uscore+1)'_'LEFT(user.uli,uscore-1)
  5588. END
  5589. ulynes.=''
  5590. ulynes.0=user.0%3
  5591. IF (user.0//3)>0 THEN ulynes.0=ulynes.0+1
  5592. DO i=1 TO ulynes.0
  5593.   ulynes.i=LEFT(user.i,25)
  5594.   DO j=1 TO 2
  5595.     k=i+j*ulynes.0
  5596.     IF k<=users THEN ulynes.i=ulynes.i' 'LEFT(user.k,25)
  5597.   END
  5598. END
  5599. CALL saveuserlist()
  5600. RETURN
  5601.  
  5602.  
  5603. showuserlist:
  5604. IF data.5='' THEN line='Here are the EMail names of your fellow users.'
  5605. ELSE line='   'WORDS(userlist) 'users. Use these names to address messages.'
  5606. SAY pen3||line||def
  5607. DO uli=1 TO ulynes.0
  5608.   SAY ulynes.uli
  5609.   IF uli//linesperpage=0 & uli<ulynes.0 THEN
  5610.     IF waiting2()=1 THEN RETURN
  5611. END
  5612. IF data.5~='' THEN CALL waiting()
  5613. RETURN
  5614.  
  5615.  
  5616. msgcount:
  5617. ARG countdir .
  5618. lastmess=0
  5619. totmsgs=0
  5620. unred=0
  5621. IF ~EXISTS(msgpath||countdir) THEN RETURN
  5622. IF STATEF(msgpath||countdir)=msg.countdir.1 THEN totmsgs=msg.countdir.0
  5623. ELSE
  5624.   DO
  5625.     totmsgs=WORDS(SHOWDIR(msgpath||countdir))
  5626.     msg.countdir.0=totmsgs
  5627.     msg.countdir.1=STATEF(msgpath||countdir)
  5628.   END
  5629. IF countdir>level | FIND(data.21,i)>0 THEN RETURN
  5630. lastread.countdir=WORD(data.22,countdir)
  5631. IF ~DATATYPE(lastread.countdir,'W') THEN lastread.countdir=0
  5632. lastmess=countcheck(bbspath'Numbers/LastMessage'countdir 0)
  5633. IF lastread.countdir<0 THEN RETURN
  5634. firstmess=countcheck(bbspath'Numbers/FirstMessage'countdir 0)
  5635. IF lastread.countdir<firstmess THEN lastread.countdir=firstmess-1
  5636. IF lastmess>0 THEN
  5637.   IF lastread.countdir>=0 THEN
  5638.     DO
  5639.       IF lastread.countdir<(firstmess-1) THEN lastread.countdir=firstmess-1
  5640.       unred=lastmess-lastread.countdir
  5641.       IF unred>totmsgs THEN unred=totmsgs
  5642.       cline=RIGHT(unred,6) 'unread of' RIGHT(lastmess,6)
  5643.       cline=cline 'messages in the 'CENTER(msg.countdir,20)' conference.'
  5644.       IF unred>0 | ~logonflag THEN SAY pen6||cline||def
  5645.     END
  5646. RETURN
  5647.  
  5648.  
  5649. counts:
  5650. SAY
  5651. SAY 'Working...'
  5652. SAY
  5653. temp=''
  5654. DO i=1 TO 4
  5655.   temp=temp||CENTER(copyright.i,75)||'0A'x
  5656. END
  5657. CALL SETCLIP('BBS_copyright',temp)
  5658. IF emailonline<0 THEN CALL countmail()
  5659. CALL bbsSTATS.rexx(name colorflag 0 emailonline grand grand2 files.0 WORDS(userlist))
  5660. SAY
  5661. CALL waiting2()
  5662. IF waitchar='Q' THEN RETURN
  5663. CALL showmarked(1)
  5664. CALL logonstats()
  5665. nonstop=0
  5666. CALL waiting()
  5667. RETURN
  5668.  
  5669.  
  5670. countmail:
  5671. SAY '   Counting online email...'
  5672. emailonline=0
  5673. DO ti=1 TO WORDS(userlist)
  5674.   emailonline=emailonline+WORDS(SHOWDIR(bbspath'Email/'WORD(userlist,ti)))
  5675. END
  5676. RETURN
  5677.  
  5678.  
  5679. hourly:
  5680. IF level=99 & nonstop~=1 THEN
  5681.   DO
  5682.     IF getinput(1 1 'Zero The Hourly Averages? (Ny) > ')='Y' THEN
  5683.       ADDRESS COMMAND 'C:Delete >*' bbspath'Numbers/Hourly/#?'
  5684.     CALL cleanline(1)
  5685.   END
  5686. CALL ShowHourly.rexx(name linesperpage colorflag nonstop)
  5687. RETURN
  5688.  
  5689.  
  5690. logonstats:
  5691. IF level=0 THEN RETURN
  5692. SAY bak2||name||def 'Last on' DATE('W',lastondate,'I') DATE(,lastondate,'I') lastontime
  5693. tempnum=countcheck(bbspath'Numbers/LastFile' 0)-lastbrowse
  5694. IF tempnum>files.0 THEN tempnum=files.0
  5695. line='of' RIGHT(countcheck(bbspath'Numbers/LastFile' 0),6) 'public files uploaded.'
  5696. IF tempnum>0 THEN SAY RIGHT(tempnum,6) '   new of' RIGHT(files.0,6) 'files online    'line
  5697. ELSE SAY '       No new' line
  5698. totmsg=0
  5699. grand=0
  5700. grand2=0
  5701. DO i=1 TO 99
  5702.   IF msg.i='' THEN ITERATE i
  5703.   CALL msgcount(i)
  5704.   totmsg=totmsg+unred
  5705.   grand=grand+totmsgs
  5706.   grand2=grand2+lastmess
  5707. END
  5708. line=RIGHT(grand2,6) 'public messages written'
  5709. IF totmsg>0 THEN
  5710.   SAY RIGHT(totmsg,6) '   new of' line',' grand 'messages online.'
  5711. ELSE SAY '       No new of' line'.'
  5712. RETURN
  5713.  
  5714.  
  5715. readopen:
  5716. PARSE ARG fname
  5717. ok=OPEN(f,fname,'R')
  5718. IF ok~=0 THEN RETURN 1
  5719. line=fname 'failed to open for reading!'
  5720. SAY line
  5721. RETURN 0
  5722.  
  5723.  
  5724. writeopen:
  5725. PARSE ARG fname
  5726. CALL CLOSE(f)
  5727. ok=OPEN(f,fname,'W')
  5728. IF ok~=0 THEN RETURN 1
  5729. line=fname 'failed to open for writing!'
  5730. SAY line
  5731. RETURN 0
  5732.  
  5733.  
  5734. set_grand:
  5735. SAY 'Setting up public message conferences...'
  5736. grand=0
  5737. DO i=1 TO 99
  5738.   IF msg.i='' THEN ITERATE i
  5739.   msg.i.0=WORDS(SHOWDIR(msgpath||i,'F'))
  5740.   msg.i.1=STATEF(msgpath||i)
  5741.   grand=grand+msg.i.0
  5742. END
  5743. RETURN
  5744.  
  5745.  
  5746. SYNTAX:
  5747. FAILURE:
  5748. lin.1=pen7||ERRORTEXT(RC)||def
  5749. lin.2=SIGL-1     SOURCELINE(SIGL-1)
  5750. lin.3=SIGL pen7||SOURCELINE(SIGL)||def
  5751. lin.4=SIGL+1     SOURCELINE(SIGL+1)
  5752. DO er=1 TO 4
  5753.   SAY lin.er
  5754. END
  5755. IF newpassword='' THEN SIGNAL DONE2  /* no user logged on, quit quietly */
  5756. CALL CLOSE(f)
  5757. IF level>sysoplevel THEN
  5758.   DO
  5759.     junk=getinput(1 1 'ReStart: (Ny) > ')
  5760.     IF junk~='Y' THEN SIGNAL LOGOUT
  5761.   END
  5762. string=''
  5763. waitchar=''
  5764. IF data.1~='' & data.5~='' & data.20~='' THEN CALL savedata(0)
  5765. SIGNAL RESTART
  5766.  
  5767.  
  5768. BREAK_E:
  5769. CALL CLOSE(f)
  5770. SAY pen3'*** CTRL-E BREAK ***'def
  5771. waitchar=''
  5772. string=''
  5773. nonstop=0
  5774. rnonstop=0
  5775. brostop=0
  5776. i=999999
  5777. wi=999999
  5778. ni=-1
  5779. RETURN 0
  5780.  
  5781.  
  5782. BREAK_C:
  5783. CALL CLOSE(f)
  5784.  
  5785. LOGOUT:
  5786. LOGOUT2:
  5787. secs=TIME('E')
  5788. mins=secs%60
  5789. secs=TRUNC(secs//60)
  5790. IF secs<10 THEN secs='0'secs
  5791. SAY
  5792. SAY 'Public messages now online: 'RIGHT(comma(grand),9)
  5793. SAY 'Public    files now online: 'RIGHT(comma(files.0),9)
  5794. SAY
  5795. SAY 'Time used this call:' mins':'secs
  5796. SAY
  5797. arg=bbspath'BBS_TEXT/GOODBYE'
  5798. IF EXISTS(arg) THEN
  5799.   DO
  5800.     CALL DELAY(14)
  5801.     CALL readlines(arg 1)
  5802.     nonstop=1
  5803.     CALL seelines(0)
  5804.     nonstop=0
  5805.   END
  5806. SAY
  5807. IF bbsprefs.2 THEN CALL doGrin()
  5808. SAY 
  5809. CALL bbsLOGOFF.baud(name level 0)
  5810.  
  5811. OUT:
  5812. data.18=winnings
  5813.  
  5814. OUT2:
  5815.  
  5816. DONE:
  5817.  
  5818. DONE2:
  5819. IF newfilesflag=1 THEN
  5820.   DO
  5821.     newfilesdate=DATE('S') TIME()
  5822.     lastbrowse=countcheck(bbspath'Numbers/LastFile' 0)
  5823.   END
  5824. IF clear_marked=1 THEN data.24=''
  5825. CALL saveData(0)
  5826. IF EXISTS(bbspath'EmailFiles/'name'/QUICKIN.lha') THEN
  5827.   ADDRESS AREXX bbsQUICKIN.rexx name level sysoplevel bbsprefs.6
  5828. IF sortuserflag=1 THEN
  5829.   DO
  5830.     CALL sortuserlist()
  5831.     IF SHOW('P','BBBBS') THEN
  5832.       DO
  5833.         CALL SETCLIP('BBS_mainusers')
  5834.         CALL SETCLIP('BBS_localusers',1)
  5835.       END
  5836.     sortuserflag=0
  5837.   END
  5838. IF sortalphaflag>0 | savefileflag>0 THEN
  5839.   DO
  5840.     IF savefileflag>0 THEN CALL savefilelist2()
  5841.     ELSE CALL savealphalist()
  5842.     IF SHOW('P','BBBBS') THEN CALL SETCLIP('BBS_localfiles',2)
  5843.   END
  5844. IF getinput(1 1 'Reset for next local user? (nY) > ')='N' THEN EXIT
  5845. clear_marked=0
  5846. data.=''
  5847. SIGNAL BIG_LOOP
  5848.  
  5849.  
  5850. checkclips:
  5851. IF GETCLIP('BBS_mainusers')~='' THEN
  5852.   DO
  5853.     CALL loaduserlist()
  5854.     CALL SETCLIP('BBS_mainusers')
  5855.   END
  5856. IF GETCLIP('BBS_mainfiles')~='' & GETCLIP('BBS_maint')='' THEN
  5857.   DO
  5858.     CALL SETCLIP('BBS_mainfiles')
  5859.     CALL loadfiles()
  5860.     CALL loadalpha()
  5861.   END
  5862. RETURN
  5863.  
  5864.  
  5865. checkalias:
  5866. addressee=''
  5867. IF alias.0=0 THEN RETURN 0
  5868. DO i=1 TO alias.0
  5869.  IF UPPER(alias.i)=UPPER(string) THEN
  5870.   DO
  5871.    addressee=realname.i
  5872.    LEAVE i
  5873.   END
  5874. END
  5875. IF addressee='' THEN RETURN 0
  5876. string=''
  5877. SAY pen3'Email to 'def||addressee
  5878. CALL editor('MAIL' addressee)
  5879. RETURN 0
  5880.  
  5881.  
  5882. Friends:
  5883. ch=''
  5884. aliasexclude='sysop bye off'
  5885. DO WHILE ch~='Q'
  5886.   SAY
  5887.   SAY pen3||LEFT('=',75,'=')def
  5888.   SAY CENTER('F R I E N D S - L I S T',75)
  5889.   SAY
  5890.   SAY CENTER('A L I A S   E D I T O R',75)
  5891.   SAY pen3||LEFT('=',75,'=')def
  5892.   SAY
  5893.   SAY '                           'pen3'W - 'def'What is the Friends List? '
  5894.   SAY '                           'pen3'A - 'def'Add an Alias '
  5895.   SAY '                           'pen3'D - 'def'Delete an Alias '
  5896.   SAY '                           'pen3'V - 'def'View my Aliases '
  5897.   SAY '                           'pen3'Q - 'def'Return to Main Menu'
  5898.   SAY
  5899.   ch=getinput(1 1 pen3'Enter Choice > 'def)
  5900.   SELECT
  5901.     WHEN ch='W' THEN CALL whatFriends()
  5902.     WHEN ch='A' THEN CALL addalias()
  5903.     WHEN ch='D' THEN CALL delalias()
  5904.     WHEN ch='V' THEN CALL viewalias()
  5905.     WHEN ch='Q' THEN CALL saveFriends()
  5906.     OTHERWISE SAY 'No such command'
  5907.   END
  5908. END
  5909. string=''
  5910. RETURN
  5911.  
  5912.  
  5913. saveFriends:
  5914. frn=bbspath'Friends/'name
  5915. IF alias.0<1 THEN
  5916.   DO
  5917.     CALL DELETE(frn)
  5918.     RETURN
  5919.   END
  5920. CALL OPEN(f,frn,'W')
  5921. DO i=1 TO alias.0
  5922.   CALL WRITELN(f,alias.i'  'realname.i)
  5923. END
  5924. CALL CLOSE(f)
  5925. RETURN
  5926.  
  5927.  
  5928. whatFriends:
  5929. CALL readlines(bbspath'Information/BBBBS.Friends' 1)
  5930. CALL cleanline(0)
  5931. CALL seelines(0)
  5932. IF waitchar~='Q' THEN CALL waiting()
  5933. nonstop=0
  5934. RETURN
  5935.  
  5936.  
  5937. addalias:
  5938. match=0
  5939. username=getinput(1 0 pen3'Enter Users Email Name > 'def)
  5940. username=cleanstring(1':'username)
  5941. IF username='' THEN RETURN
  5942. IF FIND(userlist,username)=0 THEN 
  5943.  DO
  5944.   SAY 'Username not found'
  5945.   RETURN
  5946.  END 
  5947. newalias=getinput(1 0 pen3'Enter an Alias for'def' 'username def'> ')
  5948. IF newalias='' THEN RETURN
  5949. IF alias.0>0 THEN
  5950.   DO i=1 TO alias.0
  5951.    IF UPPER(alias.i)=UPPER(newalias) THEN match=1
  5952.   END
  5953. IF FIND(aliasexclude,newalias)>0 THEN match=2
  5954. IF match=0 THEN 
  5955.   DO 
  5956.    alias.0=alias.0+1
  5957.    num=alias.0
  5958.    alias.num=newalias
  5959.    realname.num=username
  5960.    SAY alias.num 'alias as ' realname.num 'added'
  5961.   END
  5962. ELSE IF match=1 THEN SAY 'Alias 'newalias' already exists'
  5963. ELSE SAY newalias ' is a reserved name'
  5964. RETURN
  5965.  
  5966.  
  5967. delalias:
  5968. match=0
  5969. dalias=getinput(1 0 pen3'Enter Alias to Delete > 'def)
  5970. dalias=UPPER(WORD(dalias,1))
  5971. IF alias.0>0 THEN
  5972.   DO i=1 TO alias.0
  5973.    IF UPPER(alias.i)=UPPER(dalias) THEN 
  5974.     DO 
  5975.      match=1
  5976.      num=i
  5977.      LEAVE i
  5978.     END
  5979.   END
  5980. IF match=1 THEN 
  5981.  DO
  5982.   IF getinput(1 1 'Really Delete 'dalias'? (Ny) > ')='Y' THEN
  5983.    DO
  5984.     DO i=num TO alias.0
  5985.      j=i+1
  5986.      alias.i=alias.j
  5987.      realname.i=realname.j
  5988.     END
  5989.     alias.0=alias.0-1
  5990.    END
  5991.  END
  5992. ELSE SAY dalias' not Found.'
  5993. RETURN
  5994.  
  5995.  
  5996. viewalias:
  5997. IF alias.0>0 THEN
  5998. DO i=1 TO alias.0
  5999.  SAY RIGHT(alias.i,20) 'is' realname.i
  6000. END
  6001. ELSE SAY 'No Aliases assigned'
  6002. RETURN
  6003.  
  6004.  
  6005. /* bbsLOCAL.rexx */
  6006.  
  6007.  
  6008. /*  Userfile Data definitions */
  6009.  
  6010.  1 name
  6011.  2 address
  6012.  3 city state country zip
  6013.  4 telephone
  6014.  5 password
  6015.  6 protocol
  6016.  7 lines per page
  6017.  8 Preferences: MENUS COLOR STREET PHONE etc. On list=YES, ON or PUBLIC.
  6018.  9 Computer model
  6019. 10 interests        ! SYSOP edit only below this line !
  6020. 11 nn minutes n more times today  (typically 60 mins 3 times/day).
  6021. 12 first date on.  timestamp  Birthday: birthday
  6022. 13 last  date on BBS in 'S' form for rexx DATE().
  6023. 14 uploaded files bytes lastdate
  6024. 15 downloaded files bytes lastdate
  6025. 16 lastfilebrowsed lastfilelistdate lastfilelisttime
  6026. 17 ul:dl_ratio  total_email_written  last_email_read_(sysop only)
  6027. 18 winnings
  6028. 19 total time on this BBS in hours minutes calls
  6029. 20 level
  6030. 21 exclude dirs by name (conferences by number), separated by spaces.
  6031. 22 oldest messages read
  6032. 23 total msgs written per conference
  6033. 24 Marked message list  msgdirnum/msgnum
  6034. 25 filenumbers to download (temporary)
  6035. 26 QUICK exclude list
  6036. 27 Call Back Verify Number(s)
  6037.  
  6038. /* end data defines */
  6039.